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

C# 常數定義:const 與 readonly 深度比較與最佳實踐

     編輯:ASP.NET 基礎

兩種常數定義方式

在 C# 中定義常數主要有兩種關鍵字:const(編譯期常數)與 readonly(執行期常數)。雖然都能讓數值不可變,但其底層機制、適用場景與限制差異極大。

const:編譯期常數

public const int MAX_VALUE = 10;
  • 特性:隱含 static,屬於類別而非實例。編譯時直接將常數值內嵌至呼叫端的 IL 碼中。
  • 限制:只能是值型別;初始化必須在宣告時完成;不能用 new 初始化;不支援參考型別(除 string 外)。
  • 優點:零記憶體開銷、存取速度最快。
  • 缺點:版本控管風險——若常數定義在 DLL 中,呼叫端編譯後已將值內嵌,DLL 更新常數值但呼叫端未重新編譯,將導致雙方值不一致(潛在 Bug)。

readonly:執行期常數

public readonly int MAX_VALUE = 10;
// 或在建構函式指派
public readonly int MAX_VALUE;
public MyClass() { MAX_VALUE = 10; }
  • 特性:屬於實例(或標記 static 為類別級),佔用記憶體,執行期才解析值。
  • 優點:支援任何型別(含參考型別、結構);可在建構函式動態指派;跨 DLL 版本安全(呼叫端讀取記憶體位址而非內嵌值)。
  • 缺點:微小的記憶體與存取開銷。

詳細比較表

維度const (編譯期)readonly (執行期)
初始化時機宣告時必須指定宣告時或建構函式
型別限制僅值型別 + string無限制
實例關係所有實例共享同一值每個實例可有不同值
記憶體開銷無 (內嵌 IL)有 (欄位儲存)
跨 DLL 版本安全否 (需重新編譯呼叫端)是
效能極高略低

經典 Bug 案例:DLL 版本不一致

假設類庫 MyLib.dll 定義:

// 版本 1.0
public const int MAX_RETRY = 3;

呼叫端編譯後,IL 碼變成 int retry = 3;。若類庫升級為 2.0 並修改常數:

// 版本 2.0
public const int MAX_RETRY = 5;

呼叫端不重新編譯直接執行,仍使用舊值 3,導致邏輯錯誤。改用 readonly 則無此問題。

最佳實踐建議

  1. 預設使用 readonly:除非是極度效能敏感且確定不會跨 DLL 版本變更的基本型別常數(如 Math.PI 風格)。
  2. const 適用場景:純數學常數、內部專用、永不變更的編譯期已知值。
  3. readonly 適用場景:組態參數、依賴注入值、任何參考型別、需在建構函式決定的值、公開 API 介面常數。
「為了避免版本控管噩夢,現代 C# 開發強烈建議:公開常數請用 readonly,私有效能常數才考慮 const。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved