【问题标题】:C# implementing system-dependent integerC# 实现系统相关整数
【发布时间】:2011-07-15 13:16:09
【问题描述】:

我需要定义一个系统相关的整数类型,以便与一些低级库兼容。我已经设置了 x86 和 x64 项目配置,并为它们定义了条件编译符号(IA32 和 INTEL64)。

所以,我想做以下事情:

#if IA32
    typedef int SysInt;
    typedef uint SysUInt;
#elif INTEL64
    typedef long SysInt;
    typedef ulong SysUInt;
#endif

但是,由于 typedef 在 C# 中不可用,因此这不起作用。实现这一点的最佳选择是什么?

提前致谢。最好的问候。

【问题讨论】:

  • 我不认为这是可能的,你必须在你声明它们的地方写条件语句。

标签: c# integer


【解决方案1】:

你可以试试别名:

#if IA32
using SysInt = System.Int32;
#elif INTEL64
using SysInt = System.Int64;
#endif

【讨论】:

    【解决方案2】:

    看来你至少可以做这样的事情:

    #if IA32
        using SysInt = System.Int32;
        using SysUInt = System.UInt32;
    #elif INTEL64
        using SysInt = System.Int64;
        using SysUInt = System.UInt64;
    #endif
    

    这只是为您的类型设置别名。我不知道这对您的目的有多大用处,但它确实有用。

    【讨论】:

      【解决方案3】:

      您需要IntPtrUIntPtr,它们在 32 位进程中是 32 位,在 64 位进程中是 64 位。由于这些类型会自动获取进程的“位数”,因此无需条件编译或两个不同的项目配置即可使用它们。

      但是,如果您真的想对这些值进行数学运算,您应该将它们转换为 longulong 进行数学运算,然后返回到 IntPtrUIntPtr 以将它们传递给您的外部库.

      【讨论】:

      • +1 |如果这是唯一的方法......我认为我可以轻松地使用“普通”整数而不是 IntPtr 类型。
      • @FrEEzE2046:您认为使用“普通”整数而不是 IntPtr 类型的优势是什么?
      【解决方案4】:
      #if IA32
      public struct Sys
      {
         public int Int { get; set; }
      }
      #elif INTEL64
      public struct Sys
      {
         public long Int { get; set; }
      }
      #endif
      

      【讨论】:

      • 对于单个 int,您应该使用结构。并使其不可变。
      • 是的,就是这么做的 ;)
      • 你不能创建一个只读属性...你需要一个只读字段的构造函数:-)
      • 像这样使用struct 是行不通的,因为当他使用 P/Invoke 时它不会正确编组。
      猜你喜欢
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2022-01-22
      • 2010-12-21
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多