C#预处理程序指令

时间:2011-05-24 03:02:22

标签: c# c-preprocessor preprocessor-directive

在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#无法定义像#define IsBigEndian 1这样的语句或者有ya的语句,所以不知道该怎么做。

3 个答案:

答案 0 :(得分:4)

更新:正如其他海报所指出的那样(upvoted),这不是C#中字节序的解决方案。

C#Conditional compilation directives

  #if BIGENDIAN
      uint32_t h;    
      uint32_t l;
  #else
      uint32_t l;
      uint32_t h;        
  #endif
顺便说一句,如果可以,你应该避免这些。使代码更难测试。

答案 1 :(得分:2)

C#中有条件编译,但根据endianess,你不能使用它来获取不同的代码。对于托管语言,系统的endianess在编译时是未知的。

编译器生成IL代码,可以在big endian和little endian系统上执行。它是JIT编译器,负责将IL代码转换为本机机器代码,并将数字文字转换为正确的格式。

您可以使用BitConverter.IsLittleEndian在运行时查找结束语。

答案 2 :(得分:2)

由于您无法将C#结构“内存映射”为原始数据,因此使用预处理器没有真正的优势。因此,虽然C#确实具有可用于其他目的的预处理器功能,但我认为它们对您没有任何价值。

相反,只需使用一个首选结构,并为特殊情况埋下低级别的比特。以下是结构的big-endian和little-endian处理示例: