为什么BIGENDIAN是一个指令而不是在编译时解决?

6

请见谅措辞不佳,但我找不到更好的方式来解释它。

据我所知,C#是一种WORA语言——您可以在一台机器上编写它,并在另一台机器上部署它,因为MSIL直到实际运行应用程序时才被编译。

那么为什么BitConverter.IsLittleEndian被定义为这样

#if BIGENDIAN
    public static readonly bool IsLittleEndian /* = false*/;
#else
    public static readonly bool IsLittleEndian = true;
#endif

BIGENDIAN这里是一个预处理指令,意味着它在编译时被解析。如果开发者的机器是小端字节序,而目标机器使用大端字节序,那么IsLittleEndian在目标机器上是否仍然会报告true


BIGENDIAN是一个预处理器符号,而不是指令。#if是指令。 - Ben Voigt
1个回答

3
不会有问题,因为目标系统上安装的.NET运行时是为该目标系统构建/编译的,因此它的BitConverter.IsLittleEndian属性将返回false。您的代码只是引用该属性,因此它直到运行时才确定。

该属性是一个编译时的 #if BIGENDIAN 属性,因此在运行时没有可引用的属性。 - edtheprogrammerguy
3
你的代码将使用 BitConverter.IsLittleEndian 引用该属性。即使编译后,它仍然引用该属性,而不是在应用程序中硬编码为 true/false(它在运行时中是硬编码的,这就是为什么每个架构都有自己的运行时版本)。这是因为该属性被定义为 static readonly 而不是 const。如果它是 const,那么你是正确的:它将不是一个属性引用。 - Mayoor
如果你将一个已编译为字节码的 DLL 从一台机器复制到另一台机器,这样做不会出错吗?我认为使用字节码的整个目的是,在编译后 .Net DLL 应该是可移植的。 - Martin Brown
不会,它仍然可以工作。编译的dll引用了在.NET dll中定义的属性(而不是该属性的布尔值)。当您将其移动到另一种架构时,它最终会引用该系统的.NET dll。 - Mayoor

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