2011-12-11 55 views
9

我在C#文章中多次使用原生文字「關鍵字」。他們的意思是什麼?什麼是「本機」和「文字」關鍵字

例子:

string.Empty article

的空恆定保持空字符串值。我們需要調用 字符串構造函數,以便編譯器不會將其標記爲 文字。標記爲文字意味着它不會顯示爲 作爲我們可以從原生訪問的字段。

C# vs Java Wikipedia article:

簡單/原始類型
這兩種語言支持多個內置在其中複製並通過值,而不是通過引用傳遞 類型。 Java調用這些類型的基本類型,而它們在C#中被稱爲簡單的 類型。簡單/原始類型通常具有來自底層處理器體系結構的原生支持 。

回答

14

從C#規範部分2.4.4:

字面是一個值的一個源代碼表示。

因此,例如,有字符串和數字文字:

string x = "hello"; 
int y = 10; 

...但是C#有日期和時間沒有文字語法;你必須使用:

DateTime dt = new DateTime(2011, 12, 11); 

至於原生支持 - 存在着不同程度的「原生」在這裏,但就C#而言,我通常認爲在任何其輸出輸入特定的支持格式被使用。因此,例如 IL處理二進制浮點類型的指令(float,double),但是當C#編譯器發出處理decimal值的代碼時,它必須調用System.Decimal中聲明的運算符。因此,我認爲floatdouble在IL中具有原生支持,但decimal不支持。

(這將有可能寫一個C#編譯器針對不同的平臺,decimal原生支持 - 或者沒有爲floatdouble原生支持,例如可能性不大,但有可能。)

然後,當IL在執行引擎中運行時,它將運行在「真實」本機代碼之上 - 例如x86--它可以對某些類型有特定的支持。這是另一種「本土」的水平。例如,如果有人提出了IL的新版本,其中包含對decimal的本機支持,那並不意味着CPU本身突然獲得本機支持。

+0

可否請你善良,並根據你的回答更新這篇文章的解釋:「將此標記爲**文字**意味着它不會顯示爲我們可以從* * native **「 – gdoron

+2

@gdoron:我不知道 - 老實說,對我來說這沒什麼意義。我相信這是談論從本地代碼訪問,而不是支持本地類型,但我不知道評論背後的細節。 –

2

來自string.Empty文章的引用看起來像代碼註釋與其相關代碼不同步的經典案例。評論說「我們調用構造函數而不是使用文字」,但代碼不調用構造函數:它使用文字。故事的寓意:不要讓你的困惑讓你認爲你誤會了,因爲評論很混亂。

這裏有很多關於string.Empty的錯誤信息,因爲它有點奇怪。表達式new string()==「」通常應該是false,因爲新操作符通常需要創建一個新實例。但它不會創建新的實例,它將返回實例池中的實例,與「」相同,因此表達式爲true。

我懷疑「本地訪問」中的「native」是指本機代碼(Jon Skeet提到的「native」的第二個含義)。但如果我是你,我不會在那篇文章上花太多時間。它太過於關注抽象理論,反正看起來不正確。

如果您想知道string.Empty是否比「」效率更高或更低,請編譯相同函數的兩個版本,然後檢查IL。如果IL不同,請運行一些性能測試。

+0

感謝您從這些評論和文章的救贖! – gdoron

+0

該評論沒有過時。這意味着CLASS構造函數將被調用。初始化靜態字段和屬性隱式地創建一個類構造函數,該類構造函數在類第一次被引用時自動調用。 – Jesse