Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果BIGENDIAN是';编译时没有解析?_C#_.net_C Preprocessor_Directive_Endianness - Fatal编程技术网

C# 如果BIGENDIAN是';编译时没有解析?

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?否,它将按预期工作。它工作的

请原谅我的措词不好,但我找不到更好的解释方法了

据我所知,C#是一种WORA语言——您可以在一台机器上编写它,然后在另一台机器上部署它,因为MSIL在应用程序实际运行之前是不会编译的

那么为什么定义了
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