我們可以使用兩種方式來宣告常數,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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小豆干 的頭像
    小豆干

    小豆干就是我唷

    小豆干 發表在 痞客邦 留言(0) 人氣()