2011-11-02 46 views
4

關於在ASP.Net應用程序中使用這些變量,我有點混淆。C#ASP.Net Webforms - 字符串 - 靜態與靜態只讀

public static string Complete = "Complete";

據我所知,這個值將是全球所有用戶,但價值不保證因存在於應用程序池回收和值上,不分配循環?

public static readonly string Complete = "Complete";

是否readonly標誌意味着該值始終可用由於與類的靜態構造函數初始化得到,這意味着該值將始終可用?

據我所知,下面的readonly情況下會發生:

  1. 訪問變量
    • 是階級構成?沒有?指定變量
  2. 應用程序重新啓動
  3. 轉到1

是否有對readonly和非只讀版本之間有什麼區別?我想我們也可以把它寫成如下保證變量:

public static string Complete { get { return "Complete"; } }

+1

或者乾脆寫'公共常量字符串完成=「完成」;';-) –

+1

我要包括'const'但是,並不需要使用,如果說'更新所有引用組件const'? – Mig

+0

@MiG,這是一個非常強大的理由,不要輕易使用const;當你可以的時候,總是喜歡只讀const。 – Icarus

回答

4

readonly將簡單地停止改變變量被初始化一次保存的值。它不會影響靜態的生命時間 - 它仍然和以前一樣。

請注意,如果靜態爲參考,則readonly屬性不會停止底層對象的變異,它只會停止更改靜態變量的值 - 在類引用的情況下,該值是參考本身。

MSDN C對只讀#文檔:

http://msdn.microsoft.com/en-us/library/acdd6hb7(v=VS.100).aspx

一個readonly靜態都會有類似的影響到const(假設你正在靜態的東西是符合使用const)當你談論擁有一個全球不變的價值。當你第一次嘗試訪問靜態時,它將被當場初始化,永遠不會被允許改變。

所以:

public static readonly string Something = "what"; 

實際上會表現得像:

public const string Something = "what"; 

雖然後者是編譯時間常數,而前者不是 - 所以它的行爲有一些關鍵的差別。我更多地討論了全球可用的價值觀念,這種觀念並沒有改變。

就ASP而言。NET和靜態回收,只讀靜態和常量之間的區別在於,如果尚未初始化,靜態只是引發初始化。但是對於所描述的用法,const更合適。

+0

因此,在ASP.Net應用程序中,由於應用程序池回收,這兩個變量總是會返回其預期值? – Mig

+0

@MiG如果只讀靜態被回收,只要該值不是一些瘋狂的運行時確定的事情,那麼'static readonly'和'const'將爲你實現相同。這是因爲靜態會在初次訪問時初始化。如果這個值是基本的,那麼去'const'。 –

+0

對,我現在用它。而非'readonly'在首次訪問時不會被初始化? – Mig

0

public static string Complete =「Complete」;

有保證。但它也可以修改。如果你想要它是一個常量,使用const。 ABOT常量

更多信息VS readyonly VS靜態只讀Here

0

readonly關鍵字告訴這個類變量只能連同其聲明或在其c'tor初始化編譯器(因爲它是一個靜態字段,無論如何,這兩個選項是相同的)。

除此之外,沒有其他區別。

HTH - 托馬斯