C#におけるreadonlyキーワードとconstキーワードの違いを徹底解説
readonlyキーワードとは
readonlyキーワードは、宣言時またはコンストラクター内で一度だけ値を代入できる変数(読み取り専用フィールド)を定義するために使用します。一方、constキーワードは、プログラム全体で使用する定数を定義するために使用します。
両者は似たような用途で使われますが、動作や制約に重要な違いがあります。以下に、C#におけるreadonlyとconstの基本的な使用例を示します。
コード例
using System.IO;
using System;
public class Program {
public const int VALUE = 10;
public readonly int value1;
Program(int value){
value1 = value;
}
public static void Main() {
Console.WriteLine(VALUE);
Program p1 = new Program(11);
Console.WriteLine(p1.value1);
}
}実行結果
10 11
この例では、constフィールド「VALUE」は宣言時に値を代入しています。一方、readonlyフィールド「value1」は宣言時に初期化せず、コンストラクター内で引数の値を代入しています。どちらもその後変更することはできません。
readonlyとconstの主な違い
以下の表に、readonlyとconstキーワードの重要な違いをまとめます。
| No. | 項目 | readonlyキーワード | constキーワード |
|---|---|---|---|
| 1 | 目的 | 読み取り専用フィールドを作成するために使用する。 | 定数フィールドを作成するために使用する。 |
| 2 | 評価のタイミング | 実行時に値が決定される定数である。 | コンパイル時に値が決定される定数である。 |
| 3 | 値の変更 | 宣言後もコンストラクター内であれば値を変更できる。 | 宣言後に値を変更することはできない。 |
| 4 | メソッド内での宣言 | メソッド内で定義することはできない。 | メソッド内でも宣言できる。 |
| 5 | 値の代入方法 | インスタンス変数として宣言し、コンストラクターで値を代入するのが一般的。 | 宣言時に必ず値を代入する必要がある。 |
使い分けのポイント
値がプログラム全体で固定であり、コンパイル時に確定している場合はconstが適しています。一方、実行時に決まる値(設定値やコンストラクターの引数など)をインスタンスごとに保持したい場合はreadonlyを選択しましょう。また、参照型に対してconstは使用できませんが、readonlyであれば参照型のフィールドにも適用可能です。
-
GoとJavaの違いを徹底比較!特徴と使い分けのポイント
プログラミング言語を選ぶ際、「Go」と「Java」のどちらを採用すべきか迷う開発者は少なくありません。どちらもGoogleや企業システムで広く使われる人気言語ですが、設計思想や言語仕様には大きな違いがあります。本記事では、それぞれの言語の特徴を解説したうえで、両者の主な違いを比較表を使ってわかりやすく整理します。 GoとはGoはGoogleが開発した手続き型(プロシージャル)プログラミング言語です。プログラムはパッケージ単位で構成され、シンプルで読みやすいコード記述を重視した設計になっています。動的言語に近い柔軟なパターンを取り入れつつ、静的型付けによる安全性も兼ね備えています。また、軽量スレ
-
Javaのvolatileとtransientキーワードの違いを徹底解説
Javaには、それぞれ異なる目的で使われるvolatileとtransientという2つの修飾子があります。名前は似ていますが、役割はまったく別物です。この記事では、両者の違いをわかりやすく解説します。volatileキーワードとはvolatileは、主にマルチスレッド環境で使用されるキーワードです。複数のスレッドが同じ変数に対して同時に読み書きを行う場合、通常はCPUキャッシュに値が保持されるため、スレッド間で値の不整合が発生する可能性があります。volatileを付けた変数は、変更内容がCPUキャッシュを経由せずメインメモリに直接反映されるため、すべてのスレッドが常に最新の値を読み取ること