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

时间:2011-12-11 08:06:47

标签: c# .net keyword

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

示例:

string.Empty article

  

Empty常量保存空字符串值。我们需要打电话给   字符串构造函数,以便编译器不将此标记为   的字面即可。将其标记为文字将意味着它不会显示   作为我们可以从原生访问的字段。

C# vs Java Wikipedia article:

  

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

2 个答案:

答案 0 :(得分:14)

来自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具有本机支持 - 或者对float没有原生支持和double,例如。不太可能,但可能。)

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

答案 1 :(得分:2)

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

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

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

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