總結const、readonly、static三者的區別

const:靜態常量,也稱編譯時常量(compile-time constants),屬於類型級,經過類名直接訪問,被全部對象共享!函數

  a、叫編譯時常量的緣由是它編譯時會將其替換爲所對應的值;性能

  b、靜態常量在速度上會稍稍快一些,可是靈活性卻比動態常量差一些;優化

  c、靜態常量,隱式是靜態的,即被static隱式修飾過,不能再用static重複修飾,
spa

  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性能,所帶來的程序集引用不一致問題; 

  原本想好好寫一篇總結的,可是看了不少文章才發現水很深,有不少要注意的地方,不是這裏三言兩語就能說明白的。還要好好的積澱才能悟出它們的核心的區別的地方,把它們從本質上區分開來。

相關文章
相關標籤/搜索