我在C#文章中多次使用原生和文字「關鍵字」。他們的意思是什麼?什麼是「本機」和「文字」關鍵字
例子:
的空恆定保持空字符串值。我們需要調用 字符串構造函數,以便編譯器不會將其標記爲 文字。標記爲文字意味着它不會顯示爲 作爲我們可以從原生訪問的字段。
簡單/原始類型
這兩種語言支持多個內置在其中複製並通過值,而不是通過引用傳遞 類型。 Java調用這些類型的基本類型,而它們在C#中被稱爲簡單的 類型。簡單/原始類型通常具有來自底層處理器體系結構的原生支持 。
我在C#文章中多次使用原生和文字「關鍵字」。他們的意思是什麼?什麼是「本機」和「文字」關鍵字
例子:
的空恆定保持空字符串值。我們需要調用 字符串構造函數,以便編譯器不會將其標記爲 文字。標記爲文字意味着它不會顯示爲 作爲我們可以從原生訪問的字段。
簡單/原始類型
這兩種語言支持多個內置在其中複製並通過值,而不是通過引用傳遞 類型。 Java調用這些類型的基本類型,而它們在C#中被稱爲簡單的 類型。簡單/原始類型通常具有來自底層處理器體系結構的原生支持 。
從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
中聲明的運算符。因此,我認爲float
和double
在IL中具有原生支持,但decimal
不支持。
(這將有可能寫一個C#編譯器針對不同的平臺,做有decimal
原生支持 - 或者沒有爲float
和double
原生支持,例如可能性不大,但有可能。)
然後,當IL在執行引擎中運行時,它將運行在「真實」本機代碼之上 - 例如x86--它可以對某些類型有特定的支持。這是另一種「本土」的水平。例如,如果有人提出了IL的新版本,其中包含對decimal
的本機支持,那並不意味着CPU本身突然獲得本機支持。
來自string.Empty文章的引用看起來像代碼註釋與其相關代碼不同步的經典案例。評論說「我們調用構造函數而不是使用文字」,但代碼不調用構造函數:它使用文字。故事的寓意:不要讓你的困惑讓你認爲你誤會了,因爲評論很混亂。
這裏有很多關於string.Empty的錯誤信息,因爲它有點奇怪。表達式new string()==「」通常應該是false,因爲新操作符通常需要創建一個新實例。但它不會創建新的實例,它將返回實例池中的實例,與「」相同,因此表達式爲true。
我懷疑「本地訪問」中的「native」是指本機代碼(Jon Skeet提到的「native」的第二個含義)。但如果我是你,我不會在那篇文章上花太多時間。它太過於關注抽象理論,反正看起來不正確。
如果您想知道string.Empty是否比「」效率更高或更低,請編譯相同函數的兩個版本,然後檢查IL。如果IL不同,請運行一些性能測試。
可否請你善良,並根據你的回答更新這篇文章的解釋:「將此標記爲**文字**意味着它不會顯示爲我們可以從* * native **「 – gdoron
@gdoron:我不知道 - 老實說,對我來說這沒什麼意義。我相信這是談論從本地代碼訪問,而不是支持本地類型,但我不知道評論背後的細節。 –