C#
 Computer >> コンピューター >  >> プログラミング >> C#

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であれば参照型のフィールドにも適用可能です。

  1. GoとJavaの違いを徹底比較!特徴と使い分けのポイント

    プログラミング言語を選ぶ際、「Go」と「Java」のどちらを採用すべきか迷う開発者は少なくありません。どちらもGoogleや企業システムで広く使われる人気言語ですが、設計思想や言語仕様には大きな違いがあります。本記事では、それぞれの言語の特徴を解説したうえで、両者の主な違いを比較表を使ってわかりやすく整理します。 GoとはGoはGoogleが開発した手続き型(プロシージャル)プログラミング言語です。プログラムはパッケージ単位で構成され、シンプルで読みやすいコード記述を重視した設計になっています。動的言語に近い柔軟なパターンを取り入れつつ、静的型付けによる安全性も兼ね備えています。また、軽量スレ

  2. Javaのvolatileとtransientキーワードの違いを徹底解説

    Javaには、それぞれ異なる目的で使われるvolatileとtransientという2つの修飾子があります。名前は似ていますが、役割はまったく別物です。この記事では、両者の違いをわかりやすく解説します。volatileキーワードとはvolatileは、主にマルチスレッド環境で使用されるキーワードです。複数のスレッドが同じ変数に対して同時に読み書きを行う場合、通常はCPUキャッシュに値が保持されるため、スレッド間で値の不整合が発生する可能性があります。volatileを付けた変数は、変更内容がCPUキャッシュを経由せずメインメモリに直接反映されるため、すべてのスレッドが常に最新の値を読み取ること