"native"和"literal"关键字是什么?

9
我在许多C#文章中看到过本地文字"关键字"的使用。它们是什么意思?
例如: string.Empty文章: Empty常量保存空字符串值。我们需要调用String构造函数,以便编译器不将其标记为文字。将其标记为文字意味着它不会显示为一个可以从本地访问的字段。 C# vs Java维基百科文章: 简单/基本类型 两种语言都支持许多内置类型,这些类型是按值而不是按引用复制和传递的。Java将这些类型称为基本类型,而在C#中称为简单类型。这些简单/基本类型通常具有来自底层处理器架构的本地支持。
2个回答

14

根据C#规范第2.4.4节:

字面值(literal)是一个值的源代码表示。

所以举个例子,有字符串和数字的字面值:

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

然而,C#没有日期和时间的文字语法;您必须使用:

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

关于本地支持的问题 - 这里有不同程度的“本地支持”,但就C#而言,我通常会考虑在使用的任何输出格式中以类型为基础的支持。例如,有 IL 指令来处理二进制浮点类型(floatdouble),但是当 C# 编译器发出处理decimal值的代码时,它必须调用在System.Decimal中声明的操作符。因此,我认为floatdouble在 IL 中具有原生支持,但decimal没有。

(理论上,可以编写针对具有本地支持的decimal的不同平台的 C# 编译器 - 或者不具备floatdouble的本地支持的编译器。虽然可能性很小,但这是可能的。)

当 IL 在执行引擎中运行时,该引擎将在“真实”的本地代码上运行 - 例如 x86 - 它可能对某些类型具有特定的支持。这是另一种“本地”级别。例如,如果有人提出了一个新版本的 IL,其中包含对decimal的本地支持,那并不意味着 CPU 自身突然获得了本地支持。


1
请问您可否更新帖子并根据您的回答解释一下这句话的含义:“将其标记为文字意味着它不会显示为我们可以从本地访问的字段。” - gdoron
3
@gdoron说:“我不知道-老实说,这对我来说没多大意义。我认为它是在谈论从本地代码访问,而不是支持本地类型,但我不知道评论背后的细节。” - Jon Skeet

2
从string.Empty文章引用的语句看起来像是代码注释与相关代码不同步的经典案例。注释说“我们正在调用构造函数而不是使用文字”,但代码并没有调用构造函数:它使用了文字。故事的寓意是:不要让你的困惑让你认为你已经误解了,因为注释很令人困惑。
关于string.Empty存在很多错误信息,因为它是一个有点奇怪的情况。表达式new string() == ""通常预期为false,因为通常预期new运算符会创建一个新实例。但它并没有创建一个新实例,而是返回内部池中的实例,这与""相同,因此表达式为true。
我怀疑“从本地访问”中的“本地”指的是本地代码(Jon Skeet提到的第二个“本地”的含义)。但如果我是你,我不会花太多时间在那篇文章上。它过于关注抽象理论,而且似乎是不正确的。
如果您想知道string.Empty是否比""更有效率,请编译同一函数的两个版本,并检查IL。如果IL不同,请运行一些性能测试。

感谢您从那些评论和文章中拯救了我! - gdoron
该注释并不过时。它意味着将调用CLASS构造函数。隐式初始化静态字段和属性会创建一个类构造函数,该函数在第一次引用类时自动调用。 - Jesse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接