我們可以使用兩種方式來宣告常數,const (C# 參考)、readonly (C# 參考)。
1.編譯時期常數const(靜態常數)
public const int End = 10;
2.執行階段常數readonly(動態常數)
public static readonly int Start = 0;
兩種方式有相同的意義但運作方式不同,使用不當的話可能會造成一些問題發生,
在定義常數的時候會建議使用readonly而不是const,
雖說使用const的效能比使用static readonly效能好一些,
但是整體的靈活性及方便性都是static readonly勝出的。
1.const 僅能用於數字(int、float)和字串、列舉,而readonly可以是任意型態。
2.const能在方法中使用,readonly不行。(常數不應該是宣告在方法裡)
3.const是在編譯時期產生的且絕對不能變更,即常量值被替换成初始化的值,readonly是在執行時產生的
註:若要定義整數類資料型別 (Integral Type) (int、byte 等等) 的常數值,請使用列舉型別
4.const常數在宣告的時候就要初始化(指定值),readonly可以延遲到建構子中再初始化
5.const常數沒有內存的消耗,readonly因為要保存常數,所以有內存消耗
6.二者都是透過類別名稱來訪問,而不是執行個體
範例1(靜態常數)
class P { const int A=B*10; const int B=10; public static void Main(string[] args) { Console.WriteLine("A is {0},B is {1} ",A,B); } }
輸出結果:A is 100,B is 10
因為A、B的值在編譯時期就決定了(靜態常數)
範例2(動態常數)
class P { static readonly int A=B*10; static readonly int B=10; public static void Main(string[] args) { Console.WriteLine("A is {0},B is {1} ",A,B); } }
輸出結果:A is 0,B is 10
static readonly是動態常數,變數的值在編譯期間不予以解析,
所以開始都是預設值,像A與B都是int類型,故都是0。
而在程序執行到A=B*10;所以A=0*10=0,
程序接着執行到B=10这句时候,才會真正的把B的初值10赋给B。
範例3
首先先建立一個類別庫,再將它編譯成dll
namespace ClassLibrary1 { public class Class1 { public static readonly int Start = 0; public const int End = 5; } }
然後再建立一個主控台應用程式,引用這個ClassLibrary1.dll
class Program { static void Main(string[] args) { for (int i = Class1.Start; i < Class1.End; i++) { Console.WriteLine("value is {0}", i); } Console.ReadKey(); } }
執行結果:
value is 0
value is 1
value is 2
value is 3
value is 4
但當需求改變了,我們把類別庫ClassLibrary1中的值重新改過再編譯一次為dll丟上去
namespace ClassLibrary1 { public class Class1 { public static readonly int Start = 4; public const int End = 6; } }
執行結果:
value is 4
原因是const變數並沒有被改成6,還是維持著之前的5,只有readonly的變數改為4了
不能只重新編譯ClassLibrary1,要把ConsoleApplication1.exe專案打開來重新編譯
需要重新編譯的應用程式表示抽換的還不夠乾淨或是有其他問題,
如果一個大的系統裡面全部的檔案都需要重新編譯,表示你需要更新的檔案不只一個。
參考來源:
http://msdn.microsoft.com/zh-tw/library/aa645753(v=vs.71).aspx
http://www.jb51.net/article/46067.htm
http://msdn.microsoft.com/zh-tw/library/e6w8fe1b.aspx
http://www.dotblogs.com.tw/yc421206/archive/2011/06/06/27232.aspx
http://www.cnblogs.com/wangshenhe/archive/2012/05/16/2503831.html
http://www.jb51.net/article/53754.htm
留言列表