C# 如果BIGENDIAN是';编译时没有解析?
请原谅我的措词不好,但我找不到更好的解释方法了 据我所知,C#是一种WORA语言——您可以在一台机器上编写它,然后在另一台机器上部署它,因为MSIL在应用程序实际运行之前是不会编译的 那么为什么定义了C# 如果BIGENDIAN是';编译时没有解析?,c#,.net,c-preprocessor,directive,endianness,C#,.net,C Preprocessor,Directive,Endianness,请原谅我的措词不好,但我找不到更好的解释方法了 据我所知,C#是一种WORA语言——您可以在一台机器上编写它,然后在另一台机器上部署它,因为MSIL在应用程序实际运行之前是不会编译的 那么为什么定义了BitConverter.IsLittleEndian: BIGENDIAN这里有一个预处理器指令,这意味着它是在编译时解析的。因此,如果开发人员的机器是little endian,而目标使用big endian,将IsLittleEndian仍在目标机器上报告true?否,它将按预期工作。它工作的
BitConverter.IsLittleEndian
:
BIGENDIAN
这里有一个预处理器指令,这意味着它是在编译时解析的。因此,如果开发人员的机器是little endian,而目标使用big endian,将IsLittleEndian
仍在目标机器上报告true
?否,它将按预期工作。它工作的原因是,安装在目标系统上的.NET运行时是为该目标系统构建/编译的,因此它是BitConverter.IsLittleEndian
属性将返回false
。您的代码只是引用该属性,因此直到运行时才确定该属性。该属性是编译时属性\if BIGENDIAN
,因此在运行时没有可引用的属性。您的代码将使用BitConverter.IsLittleEndian
引用该属性。即使在编译时,它仍然引用该属性,而不是在应用程序中硬编码为true/false
(它在运行时硬编码,这就是为什么每个体系结构都有自己的运行时版本)。这是因为属性被定义为静态只读
,而不是常量
。如果它是const
,那么您是正确的:它不是属性引用。如果您在一台机器上复制编译为字节码的dll并将其复制到另一台机器上,这不会出错吗?我认为使用字节码的全部意义在于编译后.Net DLL应该是可移植的。不,它仍然可以工作。已编译的dll正在引用.NET dll中定义的属性(而不是该属性的布尔值)。当您将它移动到另一个体系结构时,它最终会引用该系统的.NET dll。BIGENDIAN
是一个预处理器符号,而不是一个指令<代码>#如果指令为。
#if BIGENDIAN
public static readonly bool IsLittleEndian /* = false*/;
#else
public static readonly bool IsLittleEndian = true;
#endif