サンプルソースのクラスのメンバーN1,N2.N3はいずれも値を持っていますが代入できません。
しかし、機能に細かい違いがあります。
N1はconstを利用した例です。constを使って値を定義すると絶対に変更できません。ですから、常にstatic扱いで型名を経由して使います。
N2はreadonlyを利用した例です。例外的にコンストラクタでのみ書き換えられます。オブジェクト作成時に値が確定する使い方ができます。
N3はgetのみのプロパティを使用した例です。この場合、値は値を取得する時点で確定します。N3への代入はできませんが、N3の値は可変にできます。
罠の数々 §
- C#9からは、【初期化の場合のみ書き込みができるプロパティ】も定義可能になる。これはnew C(){N3=xxx}のような書式で値を設定でき、かつそのあとは代入できないプロパティを宣言可能とする
- constを使った方法はいくら利用してもメモリ消費量は増えない (数値の定数を書いた場合とメモリ消費量は同じ)
- readonlyを使った方法は基本的に変数宣言なので、変数宣言と同じペースでメモリを消費する
- プロパティを使った方法がどれぐらいのメモリを使うのかはget節の実装内容次第
参考リンク §
const (C# リファレンス)
readonly (C# リファレンス)
get (C# リファレンス)
constとreadonlyの違いを把握することは重要だ。上記のconstとreadonlyのリンクの先でも、constとreadonlyの違いは説明されている。上記のリンクを辿って確認してみよう。
リポジトリ §
https://github.com/autumn009/cshowto
Const §
using System;
class Program
{
class C
{
public const int N1 = 123;
public readonly int N2;
public int N3 { get => N1 + N2; }
public C()
{
N2 = 456;
}
}
static void Main()
{
var obj = new C();
Console.WriteLine($"N1={C.N1}");
Console.WriteLine($"N2={obj.N2}");
Console.WriteLine($"N3={obj.N3}");
}
}
実行結果
N1=123
N2=456
N3=579