今天早些时候的一次讨论让我质疑我对原语和文字的理解是否正确。


我的理解是,文字类型是一种特殊的类型,可以使用人类和编译器都可以理解的表示法来赋值,而无需特定的类型声明:

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 是支持文字的引用类型。自定义结构是不支持文字的复合值类型。

我的理解(如果不是我的解释)在很大程度上是正确的吗?


更新: 感谢您提供的精彩信息和对话!对于发现此内容的任何人,请务必阅读评论和答案,其中有一些很好的说明以及一些有趣的旁注。

顺便提一句:这是一个难以抉择的问题,哪个答案真正值得获得绿色支票。我将其交给不幸被否决的答案,该答案不仅包含一个不错的答案,而且在评论线程中包含大量澄清和信息。公平地说,这里没有一个最佳答案,至少有三个:)

有帮助吗?

解决方案

我想一件事你没有提到的是空间和分配。原语是值类型和你提到除了字符串类型在栈上分配(只要它们不与对象相关联)(string类分配其上堆空间)。

虽然对象本身包含元有存储驻留的位置的实际对象被分配,这是在堆上。

其他然后,你的发言是很好写。你有,我错过了一个具体问题:?)

其他提示

我只是想在这里注入了快速的注意。

C#语言规范清楚地定义“字面” - 一个文字是一个值的源代码表示。文字是之类的东西true105.7'c'"hello"和空 - 它们是文本表示一个特定值

C#语言规范使用词“原始”两次;这是从来没有定义,完全模糊,什么它可能意味。

在C#语言规范有没有必要使用或定义的词“原始”,因此不应该利用这个模糊的术语。我已经受够了的Mads一个谈话,我们一致认为,该规范的未来版本将被改写,以完全消除这种用法。

如何其它类型的系统规格 - 反射库,CLI中,所述VES,等等 - 词“原始的”定义当然取决于他们。

感谢您将向上的问题。

  

我的理解(如果不是我的解释),在大多数情况下正确吗?

我不在一个点同意: 文本是某种编译时间常数(如"Hello World"5'A')的。但是,有没有“文字类型”;字面始终是实际值。

基本类型是IMO的 “基本” 类型,像字符串,整数,双精度浮点数,短,...

所以原始有它们的类型与它们连接的文字的。

是,文字是在源代码中表示的值 - 。因此,虽然支持VB日期/时间和XML文本,C#不

从C#规范,第2.4.4节:

  

A 字面是一个源代码   的值的表示。

如你说,这是不相关的值类型VS引用类型 - 串确实是一个引用类型

一字面其中没有人尚未提到的方式null ...

这也是无关的基本类型 - 从 Type.IsPrimitive

  

在原始类型是布尔值,字节,   为SByte,Int16的,UINT16,的Int32,UInt32的,   Int64的,UINT64,IntPtr的,UIntPtr,字符,   双和单

... C#的说明书实际上并不限定“原始”类型的想法,但请注意,String不是上面列表中。

在文字被编译时间常数...在C#每字面而言具有可以直接烘焙到组件的表示;在VB中多余的文字意味着他们不象CLR会明白他们的常量 - 你不能有例如const DateTime - 但他们还是文字

这里是一个MSDN页,说起CLS,其包括的字符串作为一个基本类型:

  

在.NET Framework类库   包括对应于该类型   原始数据类型编制人员   采用。这些类型的,以下是   符合CLS:字节,Int16的,的Int32,   Int64的,单人,双人,布尔,字符,   十进制,IntPtr的,和String。欲了解更多   有关这些类型的信息,请参阅   在.NET框架类类型表   库概述

不要忘记还存在 ASP.Net 文字类.

编辑:因此,标题中问题的答案是否定的,因为没有提供相同功能的“Primitive”类。不过,这可以被视为有点聪明的亚历克回应。

我觉得你的理解是正确的大部分。作为winSharp93说,文字是其本身具有类型的值,但有一个“文本类型”没有这样的事。也就是说,虽然你可以有字符串常量,字符串不是“文本类型”。正如你已经猜到了,什么定义文字是值直接记在源代码中,虽然你的要求,即无类型需要指定似乎过于严格(例如,F#有数组文本,并且可以推断出数组数的类型[| 1; 2; 3 |],但不一定能够推断空数组字面[| |]的类型)。

不幸的是,我不认为有一个良好商定的是什么造就了原始的定义。当然,作为乔恩斯基特指出,CLR都有自己的原始性(Type.IsPrimitive),这就排除了弦的定义。然而,其他有信誉的来源考虑string甚至object是原始类型内C#。我喜欢这个定义,因为有内置的支持在C#中的字符串,如使用+操作的并置和使用==作为价值的平等,而不是参考平等,还有一个事实,即字符串类型可以被称为使用短形式string而不必使用全名System.String

只需补充一点,还有另一种类型的模糊限制:的 System.Decimal 其值可在 C#语言被表达为的文字下,但是这不是一个的净原始类型

恕我直言原始类型可以简单地定义为每一个潜在的平台/主机直接“存在”的类型:如果你已经用汇编语言发挥你知道你有字节,字,双字...但你有没有字符串或小数。

实际上的净小数是 “的模拟” 由.NET运行时和不直接由仅理解硬件处理的 IEEE 754 (其然后原始类型float和双打)浮点数。

通过文字值的概念的延伸的“文字类型” 可以被认为是任何类型的,其值可以在给定语言中直接表达(C#,VB.Net,CIL ...) 。 根据这个定义文字的类型将是:所有的原始类型+字符串+小数

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top