2012-05-30 121 views
8

今天我在一個構造函數中創建了一個默認參數值。爲什麼我不能使用String.Empty作爲默認參數值?

public SomeClass (String something = String.Empty) 
{ 
    // ... 
} 

編譯器抱怨。

「something」的缺省參數值必須是編譯時間 常量。

我的印象是Empty類的String類是一個編譯時常量。

.field public static initonly string Empty 

難道我誤解了編譯時常量的含義,還是隻是我更需要接受的古怪呢?

+0

錯誤消息表明您的印象是'erm不完全正確。 –

+1

更完整的討論在這裏:http://stackoverflow.com/questions/507923/why-isnt-string-empty-a-constant –

回答

4

已接受的答案this SO問題爲什麼不是String.Empty常量?是:

靜態只讀而不是const使用的原因是由於與非託管代碼一起使用,如Microsoft在此共享源公共語言基礎結構2.0版本中所示。要查看的文件是sscli20 \ clr \ src \ bcl \ system \ string.cs。

Empty常量保存空字符串值。我們需要調用String構造函數,以便編譯器不會將其標記爲文字。

將其標記爲文字意味着它不會顯示爲我們可以從本機訪問的字段。

我在CodeProject上從這個方便的article找到了這個信息。

+0

我以爲你應該把它標記爲重複的?沒有給出答案。 – Harrison

2

A static readonly字段不是編譯時常量。它只是一個靜態字段,它在完成初始化的類後不應該改變。

在當前的.net實現中,你甚至可以用反射來改變它,這會導致非常奇怪的行爲。

您可以使用""來代替,它作爲字符串文字是編譯時間常量。

1

A readonly字段是運行時常量。直到對象(或類,如果字段爲static)被初始化,它纔會被綁定到值。

編譯時常量是文字(例如"" - 基本上與String.Empty相同),以及標記爲const的任何東西。

相關問題