const:靜態常量,也稱編譯時常量(compile-time constants),屬於類型級,通過類名直接訪問,被所有對象共用! a、叫編譯時常量的原因是它編譯時會將其替換為所對應的值; b、靜態常量在速度上會稍稍快一些,但是靈活性卻比動態常量差一些; c、靜態常量,隱式是靜態的,即被stati ...
const:靜態常量,也稱編譯時常量(compile-time constants),屬於類型級,通過類名直接訪問,被所有對象共用!
a、叫編譯時常量的原因是它編譯時會將其替換為所對應的值;
b、靜態常量在速度上會稍稍快一些,但是靈活性卻比動態常量差一些;
c、靜態常量,隱式是靜態的,即被static隱式修飾過,不能再用static重覆修飾,
d、在聲明時初始化;
e、靜態常量只能被聲明為簡單的數據類型(內建的int和浮點型)、枚舉或字元串。
f、應用場合例如:Math.PI的定義(要聲明一些從不改變且處處唯一的常量,就應該使用靜態常量)
readonly:動態常量,也稱運行時常量(runtime constants),屬於對象級,通過對象訪問。
a、而動態常量的值是在運行時獲得的;
b、動態常量在性能上稍差一點,但是靈活性好比前者好;
c、readonly可以被static修飾,這時的static readonly和const非常相似;
d、在聲明是初始化,在構造函數里初始化;(static readonly常量,如果在構造函數內指定初始值,則必須是靜態無參構造函數;)
e、動態常量可以是任意的數據類型。
f、應用場合例如:SqlHelper類的連接字元串定義
二者最大的差別在於:靜態常量在編譯時會將其換為對應的值,這就意味著對於不同的程式集來說,當你改變靜態常量的時候需要將其重新編譯,否則常量的值不會發生變化,可能引發潛在的問題,而動態常量就不會有這種情況,此時推薦使用static readonly,因為其是運行時賦值,當常量值被更改,運行時也隨之更改。
static:本不應該把static與前兩者放在一起區別對待的,但是static經常和它們攪在一起,所有這裡特別把它拿來說個事。static的意義與const和readonly迥然不同,static是指所修飾的成員與類型有關,而與對象無關。
靜態欄位和靜態構造方法,通常適用於於一些不會經常變化而又頻繁使用的數據,比如連接字元串,配置信息等,進行一次讀取,以後就可以方便的使用了,同時也節約了托管資源,因為對於靜態成員,一個靜態欄位只標識一個存儲位置。
非靜態方法可以訪問類中的任何成員,靜態方法只能訪問類中的靜態成員。
總結:const是編譯時常量,readonly是運行時常量;cosnt較高效,readonly較靈活。在應用上以static readonly代替const,以平衡const在靈活性上的不足,同時剋服編譯器優化cosnt性能,所帶來的程式集引用不一致問題;