C#のconstとreadonlyの違いとは?使い分けのポイントを徹底解説
C#には、後から変更できない値を持つフィールドを定義するためのキーワードとして「const」と「readonly」の2種類があります。どちらも定数のように扱われますが、値が決まるタイミングや初期化の方法に重要な違いがあります。本記事では、それぞれの特徴と適切な使い分けのポイントを詳しく解説します。
const(定数)とは
constで宣言されたフィールドは「コンパイル時定数」と呼ばれ、プログラムの実行中に値を変更することはできません。宣言と同時に必ず値を代入する必要がある点が大きな特徴です。
const int a = 5;
constの主な特徴
- 宣言時に必ず初期化しなければならない
- 暗黙的にstaticとして扱われるため、クラス名でアクセスできる
- 参照型ではstringとnullのみ使用可能
- コンパイル時に値がコードへ直接埋め込まれる
readonly(読み取り専用)とは
readonlyで宣言されたフィールドは「実行時定数」として扱われます。宣言時に初期化するだけでなく、コンストラクタ内で値を設定することもできます。この柔軟性により、実行時に決まる値を保持したい場合に適しています。
以下は、コンストラクタ内でreadonlyフィールドを初期化する例です。
class Calculate {
readonly int z;
public Calculate() {
z = 20;
}
}
readonlyの主な特徴
- 宣言時またはコンストラクタ内で初期化できる
- インスタンスごとに異なる値を持つことができる
- 任意の型(参照型を含む)に使用可能
- 実行時に値が確定する
constとreadonlyの比較一覧
| 項目 | const | readonly |
|---|---|---|
| 値の決定タイミング | コンパイル時 | 実行時 |
| 初期化のタイミング | 宣言時のみ | 宣言時またはコンストラクタ内 |
| staticの扱い | 暗黙的にstatic | 明示的な指定が必要 |
| 使用できる型 | 組み込み型・stringなどに限定 | すべての型が利用可能 |
まとめ
プログラム全体で絶対に変わらない固定値にはconstを、実行時に値が決まる場合やコンストラクタで初期化したい場合にはreadonlyを使うのが基本です。設定ファイルから読み込む値や計算結果の保持などにはreadonlyが適しており、数学定数のような不変の値にはconstが向いています。両者の違いを正しく理解し、状況に応じて使い分けることで、より安全で保守性の高いコードを実現できます。
-
CとC++の違いは何?主要な相違点をわかりやすく解説
C言語とC++はどちらも広く使われているプログラミング言語ですが、設計思想や搭載されている機能には大きな違いがあります。この記事では、CとC++の主な相違点を項目ごとにわかりやすく解説します。 CとC++の主な違い 1. 言語としての関係性 CはC++のサブセット(部分集合)と考えることができます。ほとんどの有効なCプログラムは、そのままC++プログラムとしてもコンパイル・実行が可能です。ただし、厳密には一部例外も存在するため注意が必要です。 2. プログラミングパラダイム Cは構造化(手続き型)プログラミング言語であり、処理の手順を上から順に記述していくスタイルが特徴です。一方、C++
-
【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説
C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons