(1) Readonly と const は両方とも定数をマークするために使用されます。
(2) 初期化の代入が異なります。
const で変更された定数には、宣言と同時に値を割り当てる必要があります。例:
public class Class1 { public const int MaxValue = 10; //正确声明 public const MInValue; //错误:常量字段要求提供一个值 public Class1() { MinValue = 10; } }
readonly フィールドは、初期化 (宣言またはコンストラクター) 中に割り当てることができます。したがって、読み取り専用フィールドは、使用されるコンストラクターに応じて異なる値を持つ可能性があります。
public class Class1 { public readonly int c = 10; //正确声明 public readonly int z; public Class1() { z = 24;//正确 } protected void Load() { z = 24;//错误:无法对只读的字段赋值(构造函数或变量初始值指定项中除外) } }
readonly はインスタンスのメンバーであるため、異なるインスタンスは異なる定数値を持つことができ、これにより readonly がより柔軟になります。
public readonly Color Red = new Color(255, 0, 0); public readonly Color Green = new Color(0, 255, 0); public readonly Color Blue = new Color(0, 0, 255);
(3) const フィールドはコンパイル時の定数ですが、readonly フィールドは実行時の定数として使用できます。
const では、コンパイラがコンパイル時に特定の値を計算できる必要があります。コンパイル時に、定数が呼び出されるすべての場所が計算された値に置き換えられます。したがって、変数から値を抽出して定数を初期化することはできません。
readonly ではフィールドを定数に設定できますが、初期値を決定するために一部の操作を実行できます。 readonly は計算時に実行されるため、特定の変数で初期化できます。この値は実行時に決定されます。
(4) const はデフォルトで static であり、static に設定されている場合は readonly を宣言する必要があります。
(5) const で変更される値の型も制限されており、sbyte、byte、short、ushort、int、uint、long、ulong のいずれかに変換できます。 、char、float、double、10 進数、bool、string、enum 型または参照型。 const として宣言できる参照型は、値が null である文字列またはその他の参照型のみであることに注意してください。 readonly は任意のタイプにすることができます。
これは、const 定数が必要な場合、その型によってコンパイル中に定数が特定の値に計算されることが制限されている場合、それを static readonly として宣言することで解決できることを意味します。しかし、両者の間にはまだわずかな違いがあります。以下の 2 つの異なるドキュメントを見てください。
file1.cs
using System; namespace MyNamespace1 { public class MyClass1 { public static readonly int myField = 10; } }
file2.cs
namespace MyNamespace2 { public class MyClass1 { public static void Main() { Console.WriteLine(MyNamespace1.MyClass1.myField); } } }
2 つのクラスは 2 つのファイル file1.cs と file2.cs に属し、別々にコンパイルされます。ファイル file1.cs 内のドメイン myField が静的読み取り専用として宣言されている場合、必要に応じて myField の値を 20 に変更すると、file2 の実行時にファイル file1.cs を file1.dll に再コンパイルするだけで済みます。 exe つまり20個もらえることになります。
ただし、static readonly を const に変更してから myField の初期化値を変更する場合は、file1.dll を参照するすべてのファイルを再コンパイルする必要があります。再コンパイルしないと、参照する MyNamespace1.MyClass1.myField が希望どおりに動作しません。これは、大規模なシステムの開発中に注意を払うことが特に重要です。
(6) object、Array(配列)、struct(構造体)はconst定数として宣言できません。
上記は、c#.net における const と readonly の違いです。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。