web-dev-qa-db-ja.com

C#のプライベートコンストネーションとプライベートリードオンオロース変数の間に違いがありますか?

C#でprivate const変数またはprivate static readonly変数を持つことの違いはありますか(const a compile-time式を割り当てていません)。

どちらも個人的なので、他のライブラリとのリンクはありません。それでそれは違いを生むのでしょうか?パフォーマンスの違いができますか?インターンされた文字列?似たものは何でも?

30
Hosam Aly

ここで、c#.netconstreadonly静的なreadonlyの違いは次のとおりです。フィールド(から この記事) )。

定数

  • デフォルトで静的
  • コンパイル時の値(すなわち、 "+" b "を持つことができますがメソッド呼び出しを持つことができません)
  • 属性で使用できます
  • それらを使用するすべてのアセンブリにコピーされます(すべてのアセンブリは値のローカルコピーを取得します)
  • 関数内で宣言することができます

ReadOnlyインスタンスフィールド

  • インスタンスが作成されたときに評価されます
  • Time Constructorの出口によって設定値を設定してください

静的READONLYフィールド

  • コード実行ヒットクラスリファレンス(I.E :: Instanceが作成された、または静的メソッドが実行されたとき)
  • 静的コンストラクタが行われた時までに値を評価した必要があります
  • ThreadStaticAttributeをこれらの上に表示したくない(Static Constructorは1つのスレッドでのみ実行され、そのスレッドに値が設定されます。他のすべてのスレッドはこの値を初期化されます)
4
Rinat Abdullin

constreadonly - C#.NETのフィールド

constはデフォルトの静的で、一定値で初期化する必要があります。これは後で変更できません。値の変更もコンストラクタには使用できません。それはすべてのデータ型では使用できません。 expateTimeの場合DateTimeデータ型では使用できません。

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public readonly string Name = string.Empty; //No error, legal
 _

readOnlyは静的として宣言できますが、必要ありません。宣言時に初期化する必要はありません。その値はコンストラクタを使用して割り当てるか変更できます。そのため、インスタンスクラスメンバーとして使用すると、利点があります。 2つの異なるインスタンス化は、readonlyフィールドの値が異なる場合があります。元のために -

class A
{
    public readonly int Id;

    public A(int i)
    {
        Id = i;
    }
}
 _

次に、次のように、readOnlyフィールドを即時の特定の値で初期化できます。

A objOne = new A(5);
A objTwo = new A(10);
 _

ここでは、Instance Objoneは、5、Objtwoが10を持つ10. Constを使用しては不可能です。

3
Chirag

違いは、静的readonlyフィールドの値が実行時に設定されているため、Constフィールドの値はコンパイル時定数に設定されます。

静的な読み取りの場合は、包含クラスはそれを変更することができます

スタティックコンストラクタ(インスタンスコンストラクターを介した変数初期化装置を介した)では、静的コンストラクタ(静的ではない場合)静的readOnlyは通常、フィールドの型がconst宣言で許可されていない場合、または値がわからない場合に使用されます。コンパイル時間。

インスタンスReadOnlyフィールドも許可されています。

どちらの場合も、参照型の場合(静的およびインスタンス)ReadOnly Modifierは、フィールドへの新しい参照を割り当てることができなくなります。それは具体的には参照によって指されたオブジェクトが不変ではない。

class Program

{

  public static readonly Test test = new Test();

  static void Main(string[] args)

  {

     test.Name = "Program";

     test = new Test(); // Error: A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)

  }

}

class Test

{

   public string Name;

}
 _

違いは、静的な読み取り専用を含むクラスによって変更できることがわかりますが、constは決して変更できず、コンパイル時定数に初期化する必要があります。静的読み取り専用ケースを少し展開するには、包含クラスはそれを変更できます。

- 変数宣言(変数初期化装置を介して)。

- 静的コンストラクター(静的ではない場合はインスタンスコンストラクタ)で。


C#.NETのconstキーワード

例: public const string abc = “xyz”;宣言でのみ初期化されます。値はコンパイル時に評価され、実行時に変更することはできません。変更しようとするとコンパイルエラーが発生します。 constはすでに静的なものです。クラスや構造体は新しいキーワードを使用して実行時に初期化されているので、クラスまたは構造体に定数を設定することはできません。しかし、それは一体型の1つでなければなりません。 c#.netでreadonlyキーワード

例: public readonly string abc;宣言コードまたはコンスタクターコードで初期化することができます。値は実行時に評価されます。静的またはインスタンスレベルの属性として宣言できます。実行時に新しいキーワードを使用して、読み取り専用フィールドが複雑なオブジェクトを保持できます。

ReadOnlyフィールドは、宣言またはaコンストラクタのいずれかで初期化できます。クラス。したがって、ReadOnlyフィールド - 使用されているコンストラクタに応じて値が異なります

ReadOnlyメンバーもランタイム定数に使用されます次の例のように:

public static readonly uint currentTicks = (uint)DateTime.Now.Ticks;
 _

ReadOnly Fieldsはではなく暗黙的に静的、したがってstaticキーワード必要に応じて明示的にreadonlyフィールドに適用できます(必須)。 。これはconstフィールドには使用できません。これは暗黙的に静的です。

ReadOnlyメンバは、初期化時に新しいキーワードを使用して複雑なオブジェクトを保持できます

0
splattne