こんにちは。今回はC#の定数の定義について、ご紹介していきます。
const、readonly、static readonlyについて、目にしたことはあると思います。
では、それぞれの違いや使い方はご存じでしょうか。
特に今まで曖昧だった方向けに本記事をご覧になっていただければと思います。
constについて
- コンパイル時に決定する定数
- 自動的にでstatic扱い。
生成したインスタンスから取得できない。 - 宣言時のみ初期化可能
- 文字列以外の参照型での初期化はできない。
(生成したインスタンスは設定不可) - 固定の値を埋め込むため、readonlyより処理速度が速い
ただし、ファイルサイズは大きくなる - デフォルト引数やswitchで使用可能
- publicで使用するとconstのバージョン管理問題があるため、privateでの使用を推奨
使用例
/// <summary>最大数</summary>
private const int MAX_COUNT = 5;
/// <summary>みかん</summary>
private const string MIKAN = "みかん";
// 例:for文の条件式で使用
for (int i = 1; i < MAX_COUNT; i++)
{
// ...処理
}
// switch文の判定で使用
switch (fruits)
{
case MIKAN:
return 15;
break;
// ...処理
}
readonlyについて
- 実行時に決定する読み取り専用変数
- 宣言、コンストラクタのどちらかで初期化が可能。
(コンストラクタ内で変更も可) - デフォルト引数やswitchで使用不可
- 生成したインスタンスを含めあらゆる値型や参照型を設定することが可能
- constと比べ、ファイルサイズを下げることができるが、処理速度が遅い
(どちらも僅かなのでそこまで気にする必要はないと思います。)
readonlyはコンストラクタ内で初期化、変更ができるのが大きな特徴となります。
使用例
class Program
{
/// <summary>
/// メイン関数
/// </summary>
/// <param name="args">引数</param>
static void Main(string[] args)
{
Class1 class1 = new Class1("読み取り専用");
// コンソール画面に「読み取り専用」と出力
Console.WriteLine(class1.YOMITORI_SENYOU);
}
}
class Class1
{
public readonly string YOMITORI_SENYOU;
/// <summary>
/// コンストラクタ
/// </summary>
public Class1(string value)
{
YOMITORI_SENYOU = value;
}
}
補足
読み取り専用のインスタンス変数という意味では、readonlyを使わず「setアクセサなし」の「getアクセサ」のみのプロパティを作成しても、良いと思います。
// 例:setは記述されていないため、読み取り専用になります。
public string Fruits
{
get { return "みかん"; }
}
static readonlyについて
- constと異なり、バージョン管理問題が起こらない。
- 生成したインスタンスやコンパイル時に計算できない値でも設定することができます。
他はconstと同様の機能を持っています。
使用例
/// <summary>テーブル一覧</summary>
public static readonly string[] TABLE_LIST = { "table1", "table2", "table3" };
foreach (string table in TABLE_LIST)
{
// ..処理
}
まとめ
いかがでしたでしょうか。
本記事ではconstよりもstatic readonlyがおすすめさせていただきます。
また、読み取り専用のインスタンスとして、readonlyやgetアクセサのみのプロパティで実行できます。
特にconstとstatic readonlyについては、バージョン管理問題があるため、さまざまな書籍でstatic readonlyを推奨しています。
※ 「実戦で役立つ C#プログラミングのイディオム/定石&パターン」etc.
必ずこの記述でないといけない。ということはありませんが、少なくとも自分やプロジェクトチームではルールを決めて実装することが大事だと思います。
本記事をご覧いただき、ありがとうございました。