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

C# 進階:const 與 readonly 的關鍵差異與編譯期陷阱

     編輯:關於C語言

基礎差異回顧

特性constreadonly
初始化時機聲明時必須初始化聲明時或構造函數中
靜態性隱含 static,不可寫 static const默認實例級,可寫 static readonly
解析時期編譯期靜態解析(常量折疊)運行期動態解析
適用範圍類成員、局部變量僅類成員
類型限制僅內建類型(string 除外)任意類型(含引用類型)

經典陷阱:跨程序集的常量陷阱

考慮以下場景:

步驟 1:定義常量庫

// Consts.cs
public class Consts
{
    public const string Const = "const";
    public static readonly string Readonly = "readonly";
}

編譯:csc /t:library Consts.cs → 生成 Consts.dll

步驟 2:客戶端引用

// Quiz.cs
public class Quiz
{
    public static void Main()
    {
        Console.WriteLine(Consts.Const);    // 輸出: const
        Console.WriteLine(Consts.Readonly); // 輸出: readonly
    }
}

編譯:csc /r:Consts.dll Quiz.cs → 生成 Quiz.exe

步驟 3:修改常量庫重新編譯(不重新編譯客戶端)

// 修改 Consts.cs
public const string Const = "CONST";
public static readonly string Readonly = "READONLY";

重新編譯 Consts.dll,直接運行 Quiz.exe,輸出將是:

CONST
READONLY

深度解析

  • const:編譯器將字面值直接內嵌到調用方 IL 中(常量折疊)。修改庫重新編譯後,調用方未重新編譯,仍保留舊值。
  • readonly:運行時從庫中讀取字段值。庫更新後,調用方無需重新編譯即可獲取新值。

最佳實踐建議

  1. 真正的編譯期常量(如 Math.PI、配置常數)用 const
  2. 可能變更的配置值、引用類型、需跨程序集版本兼容的值用 static readonly
  3. 實例級不可變字段用 readonly
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved