如果BIGENDIAN在编译时没有得到解决,为什么它是一个指令呢?

Jam*_* Ko 5 .net c# directive endianness c-preprocessor

请原谅可怜的措辞,但我找不到更好的解释方法.

根据我的理解,C#是一种WORA语言 - 您可以在一台机器上编写它并将其部署在另一台机器上,因为在实际运行应用程序之前不会编译MSIL.

那么为什么这样BitConverter.IsLittleEndian定义如下:

#if BIGENDIAN
    public static readonly bool IsLittleEndian /* = false*/;
#else
    public static readonly bool IsLittleEndian = true;
#endif
Run Code Online (Sandbox Code Playgroud)

BIGENDIAN这是一个预处理程序指令,这意味着它在编译时解析.因此,如果开发人员的机器是小端和目标使用大端,IsLittleEndian仍然报告true在目标机器上?

May*_*oor 3

不,它会按预期工作。它起作用的原因是因为安装在目标系统上的 .NET 运行时是为该目标系统构建/编译的,因此它的BitConverter.IsLittleEndian属性将返回 .NET 运行时false。您的代码只是引用该属性,因此直到运行时才确定它。

  • 您的代码将使用“BitConverter.IsLittleEndian”引用该属性。即使它被编译,它仍然引用该属性,而不是在应用程序中硬编码为“true/false”(它**在运行时**硬编码,这就是为什么每个架构都有自己的版本的运行时间)。这是因为该属性被定义为“static readonly”而不是“const”。如果它是“const”,那么你是对的:它不会是属性引用。 (3认同)