什么是“原生”和“文字”关键字

我在C#文章中多次使用原生文字 “关键字”。 他们的意思是什么?

例子:

string.Empty文章 :

Empty常量保存空字符串值。 我们需要调用String构造函数,以便编译器不会将其标记为文字 。 将其标记为文字将意味着它不会显示为我们可以从本机访问的字段。

C#vs Java维基百科文章:

简单/原始类型
这两种语言都支持许多内置类型,这些类型按值而不是通过引用进行复制和传递。 Java将这些类型称为原始类型,而它们在C#中称为简单类型。 简单/原始类型通常具有来自底层处理器体系结构的本机支持。

从C#规范第2.4.4节:

文字是值的源代码表示。

例如,有字符串和数字的文字:

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

…但是C#没有日期和时间的文字语法; 你必须使用:

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

至于本机支持 – 这里有不同级别的“本机”,但就C#而言,我通常认为它使用的是任何输出格式的类型特定支持。 因此,例如,有IL指令来处理二进制浮点类型( floatdouble ),但是当C#编译器发出处理decimal值的代码时,它必须调用System.Decimal声明的运算符。 因此我认为floatdouble在IL中有本机支持,但decimal没有。

(有可能编写一个针对不同平台的C#编译器,该平台确实具有对decimal本机支持 – 或者例如对floatdouble没有本机支持。不太可能,但可能。)

然后,当IL在执行引擎中运行时,它将在“真实”本机代码(例如x86)之上运行 – 它可以对某些类型具有特定支持。 这是“原生”的另一个层次。 例如,如果有人想出了一个新版本的IL,其中包括对decimal原生支持,那并不意味着CPU本身突然获得原生支持。

string.Empty文章中的引用看起来像代码注释与其关联代码不同步的经典案例。 注释说“我们正在调用构造函数而不是使用文字”,但代码不会调用构造函数:它使用文字。 故事的寓意:不要让你的困惑让你觉得你误解了,因为这个评论令人困惑。

关于string.Empty有很多错误信息,因为它有点奇怪。 表达式new string()==“”通常应为false,因为通常期望new运算符创建新实例。 但它不会创建新实例,它会在实习池中返回实例,它与“”相同,因此表达式为true。

我怀疑“本地访问”中的“本机”是指本机代码(Jon Skeet提到的“本机”的第二个含义)。 但如果我是你,我不会在这篇文章上花太多时间。 它过于关注抽象理论,无论如何似乎是错误的。

如果您想知道string.Empty是否比“”效率更高或更低,请编译同一函数的两个版本,并检查IL。 如果IL不同,请运行一些性能测试。