C#でconstとreadonlyの違いを理解しよう!定数の管理方法を解説
生徒
「C#で値が変わらない定数って、どうやって使うんですか?」
先生
「C#ではconstとreadonlyという2つの方法で定数を扱えます。」
生徒
「それってどう違うんですか?同じ“変わらない値”なのでは?」
先生
「それでは、constとreadonlyの違いについて、わかりやすく説明していきましょう!」
1. constとは?
const(コンスト)は、「コンスタント(constant)」の略で、プログラムが始まる前から決まっていて絶対に変わらない値を表すキーワードです。たとえば、「円周率」や「1日の時間(24時間)」など、一生変わらない値に使います。
constを使うと、その値はコンパイル時に固定され、プログラムの中で変更することができません。
書き方は以下のようになります:
const double Pi = 3.14;
Console.WriteLine("円周率は " + Pi);
円周率は 3.14
上記の例では、Piは円周率で、絶対に変わらない値なのでconstを使っています。
2. readonlyとは?
readonly(リードオンリー)は、「読み取り専用」という意味です。プログラムの実行中に一度だけ設定できて、その後は変更できない値を表します。
readonlyは、主にクラスのメンバー変数(フィールド)に使います。constと違い、実行時(ランタイム)に値を決められるので、より柔軟です。
以下のように使います:
class Circle
{
public readonly double Radius;
public Circle(double radius)
{
Radius = radius; // コンストラクタ内で初期化
}
public void ShowRadius()
{
Console.WriteLine("半径は " + Radius);
}
}
半径は 10
上記の例では、Radiusはオブジェクトが作られるときに一度だけ設定され、その後は変更できません。
3. constとreadonlyの違いを比較しよう
constとreadonlyはどちらも「一度決めたら変えられない値」ですが、以下のような違いがあります:
| 特徴 | const | readonly |
|---|---|---|
| 値の設定タイミング | コンパイル時(ソースコードに書いた時点) | 実行時(コンストラクタ内など) |
| 使える場所 | メソッド内、クラス内 | クラス内(フィールドとして) |
| 初期化方法 | 定義時にすぐ必要 | 定義時またはコンストラクタで可能 |
| 変更可能か | 不可能 | 一度だけ初期化可能 |
| 動的な値 | 使用できない | 使用できる |
たとえば、日時や設定ファイルから読み込んだ値など、実行してみないと分からない値にはreadonlyが適しています。
4. どちらを使えばいい?初心者向けの判断ポイント
定数を使うとき、以下のように選ぶとわかりやすいです:
- 「絶対に変わらない値」 →
const(例:円周率、消費税率など) - 「初期化だけしたら変えたくない値」 →
readonly(例:ユーザーID、開始日時など)
プログラミング未経験の方でも、「料理のレシピ」に例えるとイメージしやすいです。
constは「レシピに書かれていて絶対変わらない分量(例:卵は2個)」、readonlyは「そのときに決めたけど途中で変えない分量(例:冷蔵庫にあるぶんの牛乳)」のようなものです。
5. 実際に使い分けるコード例
以下は、constとreadonlyを両方使った例です。
class Config
{
public const string AppName = "MyApp"; // いつも同じ
public readonly string UserName; // 実行時に決まる
public Config(string userName)
{
UserName = userName;
}
public void Show()
{
Console.WriteLine("アプリ名:" + AppName);
Console.WriteLine("ユーザー名:" + UserName);
}
}
class Program
{
static void Main()
{
Config config = new Config("たろう");
config.Show();
}
}
アプリ名:MyApp
ユーザー名:たろう
このように、固定の情報はconst、実行時に一度だけ決まる情報はreadonlyを使いましょう。
まとめ
ここまでの内容を振り返ると、C#で定数を扱うときには、ただ値を固定するだけでなく、どのタイミングで値を決めるのか、プログラムのどこで保持するのかという考え方がとても大切であることがわかります。constとreadonlyはどちらも「変えられない値」を扱いますが、その性質や使われ方には明確な違いがあります。特に、constはコンパイル時点で絶対に変わらない値を扱う場面に向いており、実行中に外部から値が渡されることもありません。円周率のような数学的な値や、プログラムの中で不変であることがわかっている文字列など、動かす必要がない値にぴったりです。一方でreadonlyはクラスのメンバーとして設定され、実行中に一度だけ値を決めることができる仕組みです。つまり、プログラムが動き始めてから決まる情報を保持しつつ、後から変更されることを防ぎたいときに役立ちます。たとえば、ユーザー名や開始時間など、毎回違う値になるけれど、設定後に変えたいわけではない場面にぴったりです。 constはプログラムのどこからでも参照できるため、設定値を見失うことがありません。コードの意図がはっきりし、誰が読んでも理解しやすいという強みがあります。ただし、動的な情報を使えないため、設定ファイルやユーザーの入力を代入することはできません。readonlyの場合、コンストラクタの中で値を渡すことができるので、柔軟な設計を実現しやすく、オブジェクト指向の特徴とも相性が良い仕組みになっています。プロジェクトが大きくなり、複数のファイルが関わるようになると、値を固定しておく必要が出てきます。そのような場面で、constとreadonlyを正しく使い分けることで、誤った変更を防ぎ、安心してコードを保つことができます。 初心者のうちは「変えない値ならどっちでも同じではないか」と思ってしまいがちですが、実際には設計の目的が異なります。「ずっと同じ」なのがconst、「初期化したら変えない」のがreadonlyという違いがはっきりしており、この使い分けはコードの読みやすさ、保守のしやすさ、そしてミスを防ぐ仕組みにつながります。また、プログラムの一部だけを変更したときに、関連する値が予期せず変化しないようにするためにも、定数の管理は重要です。特に数値や文字列をそのままコードに書くと、どこで使っているのか追いにくくなり、何度も同じ値を使うときに修正漏れが発生しやすくなります。そこで定数でまとめておくことで、変更しやすく、管理しやすくなります。 さらに、クラスを使ったプログラムが増えると、設定値や識別子を保持する仕組みが必要になります。readonlyはオブジェクト生成時に値を決められるという性質があるため、毎回違う状態を持つインスタンスと相性が良く、現実の処理に近い形でプログラムを作れます。例えば、ログインユーザーの名前、ゲームの開始時間、計測した数値など、毎回変わるけれど途中で変化させたくない値を守ることができます。 以下はconstとreadonlyを組み合わせて、よりはっきりと使い分けが見える小さな例です。
class Setting
{
public const string Company = "サンプル株式会社";
public readonly int UserId;
public readonly string LoginTime;
public Setting(int id)
{
UserId = id;
LoginTime = DateTime.Now.ToString();
}
public void ShowInfo()
{
Console.WriteLine("会社名:" + Company);
Console.WriteLine("ユーザーID:" + UserId);
Console.WriteLine("ログイン時刻:" + LoginTime);
}
}
class Program
{
static void Main()
{
Setting s = new Setting(12345);
s.ShowInfo();
}
}
この例では、会社名は常に変わりませんが、ユーザーIDとログイン時刻は実行のたびに違う値になります。それでも、設定後に変えられないため、安心してデータを扱うことができます。このように、プログラムの目的に合わせて仕組みを選ぶことで、エラーの少ないコードづくりにつながります。 constは速くて扱いやすい定数であり、readonlyは柔軟でありながら安全な使い方ができる定数です。どちらにも役割があり、片方だけで良いとは言えません。どの状況で選び、どんな意図で使うかを意識できるようになると、プログラム全体の整合性が保たれ、安心して開発が進められます。特に複数人で作業する開発では、共有される値を見える形で管理することが大切になり、定数の知識がその土台となります。今回の内容を理解しておけば、今後のコードでも役に立つ場面が必ずあります。
生徒
「constとreadonlyって、どちらも同じと思っていましたが、実は違いがはっきりしていたんですね。」
先生
「そうなんです。ずっと変わらない値はconst、実行中に一度だけ決めたい値はreadonlyです。場面に合わせて使い分けると、とても綺麗なコードになりますよ。」
生徒
「readonlyならコンストラクタで値を設定できるので、実行ごとに違う情報も扱えるんですね。」
先生
「その通りです。特にクラスを使ったプログラムでは、readonlyが強い味方になります。使い方を覚えておけば、間違った変更も防げます。」
生徒
「これからのコードで、場面に応じて選べそうです。理解できてよかったです。」