什么是“原生”和“文字”关键字
我在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指令来处理二进制浮点类型( float
, double
),但是当C#编译器发出处理decimal
值的代码时,它必须调用System.Decimal
声明的运算符。 因此我认为float
和double
在IL中有本机支持,但decimal
没有。
(有可能编写一个针对不同平台的C#编译器,该平台确实具有对decimal
本机支持 – 或者例如对float
和double
没有本机支持。不太可能,但可能。)
然后,当IL在执行引擎中运行时,它将在“真实”本机代码(例如x86)之上运行 – 它可以对某些类型具有特定支持。 这是“原生”的另一个层次。 例如,如果有人想出了一个新版本的IL,其中包括对decimal
原生支持,那并不意味着CPU本身突然获得原生支持。
string.Empty文章中的引用看起来像代码注释与其关联代码不同步的经典案例。 注释说“我们正在调用构造函数而不是使用文字”,但代码不会调用构造函数:它使用文字。 故事的寓意:不要让你的困惑让你觉得你误解了,因为这个评论令人困惑。
关于string.Empty有很多错误信息,因为它有点奇怪。 表达式new string()==“”通常应为false,因为通常期望new运算符创建新实例。 但它不会创建新实例,它会在实习池中返回实例,它与“”相同,因此表达式为true。
我怀疑“本地访问”中的“本机”是指本机代码(Jon Skeet提到的“本机”的第二个含义)。 但如果我是你,我不会在这篇文章上花太多时间。 它过于关注抽象理论,无论如何似乎是错误的。
如果您想知道string.Empty是否比“”效率更高或更低,请编译同一函数的两个版本,并检查IL。 如果IL不同,请运行一些性能测试。