2

我有一些代码有一天会发现自己被埋在一个大型 C# 应用程序中,长期以来被遗忘和忽视,而我可能早已不在或年迈。不过,这段代码有一个严重的问题。它取决于平台的字节顺序,并且由于代码的性质,我不能简单地将它包含在if(BitConverter.IsLittleEndian). (它涉及一些 LayoutKind.Explicit 结构和接收外部值的重叠字段 - 重叠字段需要正确定位以实现小/大字节序,否则程序将在读取错误值时慢慢损坏自身)

我想要的是源代码中的编译器指令,以根据目标平台提供两种结构布局(“任何 CPU”有点问题),或者更有可能只是检测代码是否正在为其他平台编译然后是 x86 或 x64 并发出一个编译器#error,以便维护代码的人被定向到该源文件并看到我的注释,指示平台依赖性以及 big-endian 所需的任何更改。

我可以在构建配置中粘贴一个符号,但是没有一个好的方法来记录它为什么存在或以其他方式确保未来的程序员不会放弃它,或者盲目地将它复制到 ARM 或其他设备的新构建配置中大端平台。

4

1 回答 1

0

也许这样的事情会起作用?:

interface MyStruct { ... }
struct BigEndianStruct : MyStruct { ... }
struct LittleEndianStruct : MyStruct { ... }

在任何地方都使用 MyStruct 而不是特定于字节序的结构。要创建这些结构,您将拥有如下内容:

public static MyStruct CreateStruct() { 
  return BitConverter.IsLittleEndian
          ? new LittleEndianStruct()
          : new BigEndianStruct();
}
于 2013-03-23T14:22:27.020 回答