2013年7月26日 星期五

關於常數的兩三事

定義常數時,若該數值永遠不可能改變則使用 const,否則建議使用 readonly。

假設某 A.DLL 內含一 class 如下:
public sealed class Consts {
    public static readonly Int32 const1 = 50;
    public const Int32 const2 = 50;
}

某程式 B 使用了 A.DLL 內的 Consts,如下:
public void Test()  {
    Console.WriteLine(Consts.const1);
    Console.WriteLine(Consts.const2);
}

這個函式會印出
50
50

一段時間之後,A.DLL 發行新版本,Consts 被改成這樣:
public sealed class Consts {
    public static readonly Int32 const1 = 10;
    public const Int32 const2 = 10;
}

若程式 B 沒有 recompile,而使直接使用新版的 A.DLL 的話,輸出結果會是:
10
50

這是因為,const 會直接鑲進目標程式的 code 裡(效能好),readonly 則是會執行期才去取值(效能較差)。B 程式其實等價於:
public void Test()  {
    Console.WriteLine(Consts.const1);
    Console.WriteLine(50);
}

因此除非 B 做 recompile,否則 A.DLL 對於 Consts.const2 的改變不會被程式 B 看見。

出處: CLR via C# 4Ed Chapter 7

沒有留言:

張貼留言