C# 预处理器指令
本文关键字:指令 处理器 预处理 | 更新日期: 2023-09-27 17:57:23
在C++我们可以这样做:
struct {
#if defined (BIGENDIAN)
uint32_t h;
uint32_t l;
#else
uint32_t l;
uint32_t h;
#endif
} dw;
现在,在 C# 中不是那么简单。我有一个测试BigEndian的方法,但在编译时定义结构,我们如何在C#中获得相同的效果?我在想我可以有像"BoardBig"和"BoardLittle"这样的类,并使用工厂根据IsBigEndian检查获得我需要的类。对于_WIN64检查,我可以有类似"Position_64"和"Position_32"之类的类。这是一个好方法吗?由于 C# 无法定义像 IsBigEndian 1 #define 或 whathave you 这样的语句,因此不确定该怎么做。
更新:正如其他海报所指出的(赞成),这不是 C# 中字节序的解决方案。
C# 条件编译指令
#if BIGENDIAN
uint32_t h;
uint32_t l;
#else
uint32_t l;
uint32_t h;
#endif
顺便说一句,如果可以的话,你应该避免这些。使代码更难测试。
由于无法将 C# 结构"内存映射"到原始数据,因此为此目的使用预处理器没有真正的优势。 因此,虽然 C# 确实具有可用于其他目的的预处理器功能,但我认为它们在这里对您没有价值。
相反,只需使用一种首选结构,并为特殊情况埋葬低级的位抖动。 下面是结构的大端和小端处理的示例:
- 将大端字节集合编组到结构中以提取值
C# 中有条件编译,但不能使用它根据字节序获取不同的代码。对于托管语言,系统的字节序在编译时是未知的。
编译器生成 IL 代码,这些代码可以在大端序和小端序系统上执行。JIT 编译器负责将 IL 代码转换为本机机器代码,并将数字文本转换为正确的格式。
您可以使用BitConverter.IsLittleEndian
在运行时找出字节序。