首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 2:常數優先用 readonly 而非 const(上)

     編輯:關於C語言

兩種常數的本質差異

C# 提供兩種常數機制:

  • 編譯時常數:const,值在編譯期確定,內嵌至呼叫端 IL
  • 執行時常數:readonly,值在執行期(建構函式)確定,透過欄位存取

語法對照

// 編譯時常數 - 隱含 static
public const int Millennium = 2000;

// 執行時常數 - 可為 instance 或 static
public static readonly int ThisYear = DateTime.Now.Year;
public readonly Guid InstanceId = Guid.NewGuid(); // 每個實體不同

const 的限制

  • 僅限基本型別、string、enum
  • 不可使用 new、方法呼叫、運算式初始化
  • 隱含 static,無法成為執行個體成員
  • 初始化運算式必須為常數運算式

readonly 的彈性

  • 支援任意型別(含參考型別、結構、陣列)
  • 可在建構函式中初始化(含邏輯運算)
  • 可為 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved