Dot-Net

在 C# 中,術語“原始”和“文字”可以互換嗎?

  • September 19, 2019

今天早些時候的一次討論讓我質疑我對原語和文字的理解是否正確。


我的理解是,文字類型特別是一種可以使用人類和編譯器都可以理解的符號分配值的類型,而無需特定的類型聲明:

var firstName = "John"; // "John" is literal

var firstName = (string)"John"; // *if* the compiler didn't understand that "John"
                               // was a literal representation of a string then I
                               // would have to direct it as such

我對原語的理解是,它們本質上是編譯器可以理解的元素數據類型,比如 int:

int age = 25;

…文字可以是非原始的,例如 VB9 對 XML 文字的支持。一個非現實世界的例子是如果 System.Drawing.Point 可以用文字分配:

Point somePoint = 2,2; // both X and Y are primitive values, however Point is a
                      // composite value comprised of two primitive values

最後(這個問題反過來又導致我提出上述問題):我的理解是,一個類型是原始類型還是文字類型,與它是值類型還是引用類型沒有直接關係。

例如 System.String 是一種支持文字的引用類型。自定義結構是不支持文字的複合值類型。

我的理解(如果不是我的解釋)在很大程度上是正確的嗎?


***更新:***感謝偉大的資訊和對話!對於任何發現此問題的人,請務必閱讀評論和答案,這裡有一些很好的說明以及一些有趣的旁注。

順便說一句:哪個答案真正值得獲得綠色大支票是一個折騰。我將其提供給不幸被否決的答案,該答案不僅包含一個不錯的答案,而且在評論執行緒中包含許多澄清和資訊。公平地說,這裡沒有一個最佳答案,至少有三個:)

我只是想在這裡註入一個簡短的說明。

C# 語言規范明確定義了“文字”——文字是值的原始碼表示。文字是諸如true, 10, 5.7,'c'"hello"null 之類的東西——它們是表示特定值的**文本

C# 語言規範兩次使用“原始”一詞;它從來沒有被定義過,並且對於它可能意味著什麼是完全模糊的。

C# 語言規範不需要使用或定義“原始”一詞,因此不應使用這個模糊的術語。我已經與 Mads 進行了交談,我們已經同意未來版本的規範將被改寫以完全消除這種用法。

其他類型系統規範(反射庫、CLI、VES 等)如何定義“原始”一詞當然取決於它們。

感謝您提出問題。

我的理解(如果不是我的解釋)在很大程度上是正確的嗎?

我有一點不同意:文字是某種編譯時間常數(as或"Hello World")。但是,沒有“文字類型”;文字始終是實際值。5``'A'

原始類型是 IMO“基本”類型,如字元串、int、double、float、short、…

所以原始的文字類型與它們相關聯。

引用自:https://stackoverflow.com/questions/2066035