C# 提供兩種常數機制:
const,值在編譯期確定,內嵌至呼叫端 ILreadonly,值在執行期(建構函式)確定,透過欄位存取// 編譯時常數 - 隱含 static
public const int Millennium = 2000;
// 執行時常數 - 可為 instance 或 static
public static readonly int ThisYear = DateTime.Now.Year;
public readonly Guid InstanceId = Guid.NewGuid(); // 每個實體不同
string、enumnew、方法呼叫、運算式初始化static,無法成為執行個體成員static 或執行個體欄位// Infrastructure.dll
public class UsefulValues
{
public static readonly int StartValue = 5; // 執行時常數
public const int EndValue = 10; // 編譯時常數
}
Client.exe 參考 Infrastructure.dll:
// Client.exe 編譯後 IL
int a = UsefulValues.StartValue; // ldsfld 讀取欄位
int b = UsefulValues.EndValue; // ldc.i4.s 10 直接內嵌
若 Infrastructure 更新 EndValue = 20 但 Client 未重新編譯,Client 仍見 10。
StartValue 則自動取得新值 5(或更新後的值)。
寧可選擇執行稍慢但正確的 readonly,不要選擇執行較快但可能出錯的 const。除非明確需要編譯時常數特性(屬性參數、列舉、永不變更的基本值),否則一律用 readonly。