public class Constants {
// 宣告時初始化
public static readonly double PI = 3.1415926535;
public static readonly Color White = new Color(255, 255, 255);
// 建構子初始化 (僅限實例 readonly)
public readonly Guid InstanceId;
public Constants() => InstanceId = Guid.NewGuid();
}
static readonly 屬於類別,在靜態建構子或宣告處初始化。readonly 在每個實例建構時初始化。| 特性 | const | readonly |
|---|---|---|
| 初始化時機 | 編譯期 | 執行期 (靜態建構子/實例建構子) |
| 允許型別 | 內建值型別 + string | 任意型別 (含參考型別、陣列、自訂結構) |
| IL 表現 | 數值內嵌至呼叫端 | 保留欄位參考,執行期讀取 |
| 版本控制影響 | 修改值需重新編譯所有消費者組件 | 修改值無需重新編譯消費者組件 |
| 屬性參數使用 | 可作為屬性參數 | 不可 |
// AssemblyA.dll (Library)
namespace Lib {
public class Config {
public static readonly int MaxConnections = 100; // v1.0
// 升級為 v1.1: public static readonly int MaxConnections = 200;
}
}
// AssemblyB.exe (Consumer)
using Lib;
class Program {
static void Main() {
Console.WriteLine(Config.MaxConnections); // 執行期讀取 AssemblyA 當前值
}
}
若 MaxConnections 是 const,升級 Library 後 Consumer 必須重新編譯才能取得新值;改用 static readonly,Consumer 直接執行新版 DLL 即可獲得新值,實現二進位相容版本控制。
public readonly struct Point3D {
public readonly double X, Y, Z; // C# 7.2+ readonly 修飾詞可加在欄位
public Point3D(double x, double y, double z) { X = x; Y = y; Z = z; }
}
public class DataHolder {
public static readonly int[] Primes = { 2, 3, 5, 7, 11 }; // 陣列參考不可變,但元素可修改!
// 若需元素也不可變,改用 ImmutableArray 或 readonly struct 陣列
}
readonly 修飾結構體欄位。static readonly,除非需作為屬性參數或編譯期常數運算。readonly,透過建構子初始化。init 存取器 (C# 9) 實現更優雅的不可變物件初始化。