今天早些时候的一次讨论使我怀疑我对基本词和文字的理解是否正确。
我的理解是,文字类型特别是一种类型,它可以使用人工和编译器都可以理解的符号分配一个值,而不需要特定类型声明:
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;...a文字可以是非原语的,例如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是一种支持文字的引用类型。自定义结构是不支持文字的复合值类型。
大多数情况下我的理解(如果不是我的解释)是正确的吗?
更新:感谢您的精彩信息和对话!对于发现这一点的人,一定要阅读评论和答案,有一些很好的澄清,以及一些有趣的旁注。
顺便说一句:这是一种折腾,在这两者之间,答案确实值得得到大的绿色支票。我给它的不幸被否决的答案,其中不仅包含一个体面的答案,但许多澄清和信息在评论线。公平地说,这里没有一个最好的答案,至少有三个:)
发布于 2010-01-14 17:23:42
我想你没有提到的一件事就是空间和分配。原语是值类型,并在堆栈上分配(只要它们不与对象相关联),除了前面提到的字符串类型( string类在堆上分配其空间)。
尽管对象本身包含原语,但存储驻留在分配实际对象的地方,即堆上。
另外,你的陈述写得很好。你有一个我错过的具体问题吗?
发布于 2010-01-25 19:51:15
我只想在这里打个便条。
C#语言规范明确定义了“文字”--文字是一个值的源代码表示。文字是像true、10、5.7、'c'、"hello"和null这样的东西--它们是代表特定值的文本。
C#语言规范两次使用“原语”一词;它从来没有定义过,并且对它可能的含义完全模糊。
C#语言规范不需要使用或定义“原语”一词,因此不应该使用这个模糊的术语。我已经和Mads谈过了,我们已经同意规范的未来版本将被重新定义,以完全消除这种用法。
其他类型的系统规范--反射库、CLI、VES等等--如何定义“原语”这个词当然取决于他们。
谢谢你提这个问题。
发布于 2010-01-14 17:20:58
我的理解(如果不是我的解释)大部分是正确的吗?
有一点我不同意:文字是某种编译时间常数(如"Hello World"、5或'A')。但是,不存在“文字类型”;文字总是实际值。
原语类型是IMO“基本”类型,如字符串、int、double、float、short、.
所以原始的文字类型和它们有联系。
https://stackoverflow.com/questions/2066035
复制相似问题