【C#】const、readonly、static readonlyの使い方・違いについて

スポンサーリンク
アイキャッチ 猫C#
スポンサーリンク

こんにちは。今回は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がおすすめさせていただきます。
また、読み取り専用のインスタンスとして、readonlygetアクセサのみのプロパティで実行できます。

特にconstとstatic readonlyについては、バージョン管理問題があるため、さまざまな書籍でstatic readonlyを推奨しています。
※ 「実戦で役立つ C#プログラミングのイディオム/定石&パターン」etc.

必ずこの記述でないといけない。ということはありませんが、少なくとも自分やプロジェクトチームではルールを決めて実装することが大事だと思います。

本記事をご覧いただき、ありがとうございました。

本ブログで一押しのオンラインスクールのご紹介♪




本ブログで一押しのオンラインスクール「Udemy」
筆者も利用しているスクールで、日頃の隙間時間に好きな講座が学べるので大活躍です♪

ジャンルが豊富で学びたい講座がきっとみつかる

AI・データサイエンスなど最先端のIT技術からプレゼンなどビジネススキルに関する講座まで15.5万以上(※海外講座含む)あるため、自分が学びたい講座をみつけることができます

お手頃な価格帯

1講座あたり数千~数万円程度で実践的なスキルアップが可能です。
講座は一度購入すれば視聴期限なく受講でき、30日返金保証もついているので安心して始めることができます。

学びやすい多彩な機能

0.5~2倍の変速機能で自分のペースで受講が可能、専用アプリを使えばスマホからオフライン環境でも視聴が可能です!
また、講師に直接掲示板から質問ができるので疑問を解決し自学自習をサポートしてくれます。

購入前に視聴できますので、是非興味のある方は↓をクリックしてみてください。




C#プログラミング
スポンサーリンク
nyanblog
タイトルとURLをコピーしました