C#でconst、readonly、staticを使用する方法

キーワードconst、readonly、およびstaticは、C#でプログラミングするときによく使用されます。ただし、これらのキーワードには重要な違いがありますが、類似点があるため、どちらをいつ使用するかがわかりにくい場合があります。この記事では、C#のconst、static、readonlyキーワード、それらの比較方法、およびC#アプリケーションでの使用方法について説明します。

この記事で提供されているコード例を使用するには、システムにVisual Studio2019がインストールされている必要があります。まだコピーをお持ちでない場合は、こちらからVisual Studio2019をダウンロードできます。 

Visual Studio2019でコンソールアプリケーションプロジェクトを作成する

まず、VisualStudioで.NETCoreコンソールアプリケーションプロジェクトを作成しましょう。Visual Studio 2019がシステムにインストールされていると仮定して、以下に概説する手順に従って、VisualStudioで新しい.NETCoreコンソールアプリケーションプロジェクトを作成します。

  1. Visual StudioIDEを起動します。
  2. 「新しいプロジェクトの作成」をクリックします。
  3. 「新規プロジェクトの作成」ウィンドウで、表示されたテンプレートのリストから「コンソールアプリ(.NETCore)」を選択します。
  4. [次へ]をクリックします。
  5. 次に表示される[新しいプロジェクトの構成]ウィンドウで、新しいプロジェクトの名前と場所を指定します。
  6. [作成]をクリックします。

これにより、Visual Studio2019で新しい.NETCoreコンソールアプリケーションプロジェクトが作成されます。このプロジェクトを使用して、この記事の後続のセクションでC#でのconst、readonly、およびstaticキーワードの使用法を説明します。

C#でconstキーワードを使用する

C#のconst(read:constant)キーワードは、定数変数、つまりプログラムの存続期間中に値が変更されない変数を定義するために使用されます。したがって、宣言時に定数変数に値を割り当てることが不可欠です。

定数変数のこの値は、「コンパイル時」の値とも呼ばれます。constキーワードを使用して宣言された変数は、コンパイル時定数とも呼ばれます。定数変数は不変であることに注意してください。つまり、定数変数に割り当てられた値は後で変更することはできません。

次のコードスニペットは、C#でconstキーワードを使用してコンパイル時定数を定義する方法を示しています。

const string connectionString = "ここでデータベース接続文字列を指定してください。";

定数変数を定義するときに、定数変数に値を割り当てる必要があることに注意してください。constキーワードを使用して定数オブジェクトを作成することはできないことにも注意してください。constキーワードは、プリミティブデータ型(int、float、chars、booleansなど)と文字列にのみ適用できます。例を挙げてconstの使用法を理解しましょう。

Authorという名前の次のクラスについて考えてみます。簡単にするために、Authorクラスにはいくつかのプロパティのみを指定します。

パブリッククラス作成者

    {{

        public int Id {get; セットする; }

        public string FirstName {get; セットする; }

        パブリック文字列LastName {get; セットする; }

        パブリック文字列アドレス{取得; セットする; }

    }

ここで、constキーワードを使用してAuthorクラスの定数オブジェクトを作成しようとすると、以下の図1に示すコンパイルエラーが発生します。

このエラーは、代入演算子の右辺が式を満たすために定数値を持つ必要があることを示しています。ステートメントnew Author()は定数ではないため、割り当ては無効であり、エラーが発生します。

C#でreadonlyキーワードを使用する

readonlyキーワードを使用して、変数またはオブジェクトを読み取り専用として定義できます。これは、変数またはオブジェクトに、クラススコープまたはコンストラクターでのみ値を割り当てることができることを意味します。コンストラクター以外のメソッドでは、値を変更したり、読み取り専用の変数またはオブジェクトに値を再割り当てしたりすることはできません。

例を挙げてこれを理解しましょう。DbManagerという名前の次のクラスについて考えてみます。

パブリッククラスDbManager

    {{

        パブリック読み取り専用文字列connectionString =

        "ここでデータベース接続文字列を指定してください。";

        public DbManager()

        {{

            connectionString = "ここで値を再割り当てできます。";

        }

        public void ReAssign()

        {{

            connectionString = "これは許可されていません";

        }

    }

上記のコードはコンパイルされず、図2に示すエラーが表示されます。

C#でstaticキーワードを使用する

C#のstaticキーワードは、変数、メソッド、またはオブジェクトで使用できます。クラスの静的メンバーは、型のインスタンスではなく、オブジェクトの型に属していることに注意してください。つまり、静的メンバーには、インスタンスの名前ではなく、クラスの名前でアクセスします。 

静的メソッドを含むUtilityという名前の次のクラスについて考えてみます。

パブリッククラスユーティリティ

    {{

        public static void SomeMethod()

        {{

            //ここにコードを記述します

        }

    }

SomeMethod()Utilityクラスのインスタンスを使用してメソッドを呼び出すことはできません。むしろ、次の構文を使用してこのメ​​ソッドを呼び出す必要があります。

Utility.SomeMethod();

同じルールが静的変数または静的オブジェクトに適用されます。以下に示す構文を使用することによってのみ、クラスの静的メンバーを参照できます。

ClassName メンバー;

または

ClassName メンバー();

クラスのコンストラクターは静的にすることができます。クラスの静的コンストラクターは、クラスの静的メンバーを初期化するために使用されます。ただし、クラスの静的コンストラクターはパラメーターを受け入れることができません。

const、readonly、およびstaticのルール

const、readonly、およびstaticキーワードを操作するときに従うことができる経験則は次のとおりです。変数に含まれる値がアプリケーションの存続期間中に変更されない場合は、constキーワードを使用します。オブジェクトの変数の値を変更する必要があるかどうかわからないが、他のクラスが値を変更しないようにしたい場合は、readonlyキーワードを使用します。クラスのメンバーを型のインスタンスではなく型に属するようにする場合は、staticキーワードを使用します。

C#でさらに多くのことを行う方法:

  • C#でデータ注釈を使用する方法
  • C#8でGUIDを操作する方法
  • C#で抽象クラスとインターフェイスを使用する場合
  • C#でAutoMapperを操作する方法
  • C#でラムダ式を使用する方法
  • C#でAction、Func、およびPredicateデリゲートを操作する方法
  • C#でデリゲートを操作する方法
  • C#で簡単なロガーを実装する方法
  • C#で属性を操作する方法
  • C#でlog4netを操作する方法
  • C#でリポジトリデザインパターンを実装する方法
  • C#でリフレクションを操作する方法
  • C#でfilesystemwatcherを操作する方法
  • C#でレイジー初期化を実行する方法
  • C#でMSMQを操作する方法
  • C#で拡張メソッドを操作する方法
  • C#でラムダ式を使用する方法
  • C#でvolatileキーワードを使用する場合
  • C#でyieldキーワードを使用する方法
  • C#でポリモーフィズムを実装する方法
  • C#で独自のタスクスケジューラを構築する方法
  • C#でRabbitMQを操作する方法
  • C#でタプルを操作する方法
  • C#での仮想メソッドと抽象メソッドの調査
  • C#でDapperORMを使用する方法
  • C#でフライウェイトデザインパターンを使用する方法