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

C# 常數定義:const vs readonly 深度解析與選擇指南

     編輯:關於C語言

前言

C# 提供兩種定義常數的方式:const(編譯期常數)與 readonly(執行期常數)。兩者在記憶體模型、型別限制、版本相容性上有本質差異。本文深度解析並給出選擇建議。

const:編譯期常數


public const int MaxValue = 10;
// 隱含 static,等同於
public static const int MaxValue = 10; // 語法錯誤,僅示意
  • 必須初始化:宣告時指定常值。
  • 型別限制:僅限實質型別(int, double, string, enum 等),不可為參考型別(除 string),不可用 new 建構。
  • 編譯期置換:所有呼叫端 IL 直接內嵌常值(ldc.i4.10),無記憶體配置。
  • 版本陷阱:若 DLL 更新 const 值,呼叫端未重新編譯仍使用舊值 → 行為不一致。

readonly:執行期常數


public readonly int MaxValue = 10;
// 或在建構函式指派
public readonly int MaxValue;
public MyClass() => MaxValue = 10;
  • 可延遲初始化:宣告時或建構函式指派。
  • 無型別限制:任意型別(含陣列、自訂類別、結構)。
  • 記憶體配置:每個實例/型別擁有儲存空間,透過欄位存取(ldsfld/ldfld)。
  • 版本安全:DLL 更新值,呼叫端無需重編譯即可取得新值。
  • 實例差異:非 static readonly 可隨實例不同而有不同值。

比較總表

特性constreadonly
初始化時機宣告時宣告時或建構函式
型別限制僅實質型別無限制
記憶體無(IL 內嵌)有(欄位儲存)
存取速度極快(常值)快(欄位讀取)
版本相容需重編譯呼叫端無需重編譯
適用對象絕對不變的常值(如 Math.PI)組態值、執行期決定的常數

版本陷阱實例


// Lib.dll v1.0
public const int MaxConnections = 10;

// App.exe 編譯時內嵌 10
int limit = MaxConnections; // IL: ldc.i4.10

// Lib.dll v1.1 修改為 20
// App.exe 不重編譯直接執行 → limit 仍為 10 → Bug!

改用 readonly 則無此問題。

選擇指南

  1. 真正不變的通用常數(圓周率、緩衝區大小)→ const。
  2. 可能隨版本調整、需跨組件共享、或為參考型別 → readonly。
  3. 預設建議:優先使用 readonly,除非確定為基本型別且永不變更。

結語

const 與 readonly 的核心差異在於編譯期 vs 執行期。理解版本相容性陷阱,並在架構層級制定常數定義規範,能避免難以追蹤的部署 Bug。

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