get アクセサーのみを使用してプロパティを宣言できます (set アクセサーを宣言しなくても、private を宣言することさえできません)。
private const Int16 protocol_version = 1;
public Int16 ProtocolVersion {
get { return protocol_version; }
}
これは、定数のみを定義することと同じではありません。定数はコンパイル時に解決されるため、依存プログラムを再コンパイルせずにライブラリを更新すると、プログラムは依然として「古い」値を参照します。次の例を検討してください。
// The class library
using System;
namespace MyClassLibrary {
public class X {
public const Int16 protocol_version = 1;
public Int16 ProtocolVersion { get { return protocol_version; } }
}
}
// The program
using System;
using MyClassLibrary;
class Program {
static void Main(string[] args) {
X x = new X();
Console.WriteLine("Constant : {0}", X.protocol_version);
Console.WriteLine("Getter: {0}", x.ProtocolVersion);
}
}
ここで、最初にコンパイルしてプログラムを実行します。あなたが見るでしょう
Constant : 1
Getter : 1
次に、protocol_version を 2 に変更し、プログラムを再コンパイルせずにクラス ライブラリのみを再コンパイルし、新しいクラス ライブラリをプログラム フォルダに配置して実行します。以下が表示されます。
Constant : 1
Getter : 2
実際には、それが単なる定数である場合、値はコンパイル時に置き換えられます。
あなたが実際に探しているのはstatic readonly
変数だと思います。そのようにして、コンパイル時の const 置換を回避し、変数は初期化後に変更できなくなります。
public static readonly Int16 protocol_version = 1;