别名C#中的基本类型和常量

时间:2011-09-01 08:52:59

标签: c#

我们有一个C ++代码,它定义了一个统一的命名约定(主要是出于多平台的原因) 例如:

#define FOO_UINT32 unsigned long
#define FOO_TRUE true

现在,我们希望将一些代码移植到C# 对于示例中的第一个定义,我发现我需要:

using FOO_UINT32 = System.UInt32;

问题是?我该怎么做第二个?

7 个答案:

答案 0 :(得分:4)

由于true不是类型,因此您无法使用using指令对其进行别名。您可以使用static成员创建const类,以获得类似的结果:

public static class PortConstants
{
    public const bool FOO_TRUE = true;
}

然后你可以说bool x = PortConstants.FOO_TRUE;。不过,我建议您只使用true

您可能还想删除using的{​​{1}}别名,因为CLR类型不会更改,并且在可以使用CLR的平台上保持一致。

答案 1 :(得分:2)

您需要定义一个常数,即最接近的常量。

public const bool FOO_TRUE = true;

另请注意,处理类型别名的using“技巧”将用于仅在 中定义的文件。

现在,更大的问题是,您是移植还是转换?通过移植我的意思是你希望能够尝试将原始源库的更新合并到端口中。

通过转换,您基本上可以重新实现功能。

如果你正在做后者,你应该完全放弃这些“技巧”并选择一种C#/。NET方式来代替它。

请注意,如果在代码中使用UInt32,则此类型永远不会更改为16位或64位,具体取决于平台,它始终为32位且无符号。因此,在.NET和C#中大大减少了处理平台不一致性的这种别名类型的需求,因此我的建议是完全省略该类型别名并改为使用UInt32

同样适用于FOO_TRUEtrue始终是bool类型,无论平台如何。

前瞻性代码的最佳之处在于使用您正在编程的平台的习语。

答案 2 :(得分:1)

好吧,我建议不要这样做......使用C#代码中的System.UInt32代替FOO_INT32安全。

使用true选项,它是一个值,因此无法使用别名。你需要做一个常数,但是,除非它是一个很好的常数,否则不要:

public class Constants
{
    public const double PI = 3.14; // good use of constants, accuracy of PI could improve in future.
    public const bool FOO_TRUE = true; // bad use of constants, or at the very least, bad naming
}

答案 3 :(得分:0)

带有consts的静态类可能

public static class Constants
{
   public const bool FOO_TRUE = true;
}

答案 4 :(得分:0)

然而

C# does provide a #define directive

  

#define指令不能用于按原样声明常量值   通常用C和C ++完成。 C#中的常量最好定义为   类或结构的静态成员。如果你有几个这样的   常量,考虑创建一个单独的“常量”类来保存   它们。

最好创建一个静态类并定义它们:

public const bool FOO_TRUE = true;

我会问,你为什么要这样做?

答案 5 :(得分:0)

在C ++中这是一个坏主意,至少你应该使用typedef。在C#中没有意义,因为底层平台可以保证可移植性。只是不要这样做。

答案 6 :(得分:0)

如果需要,您也可以使用枚举,我通常更喜欢它们而不是常量。

[Flags]
enum FOO_UINT32 : uint
{
    MyFlag1 = 0x00000002u,
    MyFlag2 = 0x80000000u,
    FOO_TRUE = 1,
}

public static class MyFunctions
{
    public static function MyFunction(FOO_UINT32 value);
}


// In your code

MyFunctions.MyFunction(FOO_UINT32.MyFlag1 | FOO_UINT32.MyFlag2);
MyFunctions.MyFunction(0);
MyFunctions.MyFunction(FOO_UINT32.FOO_TRUE);
MyFunctions.MyFunction((FOO_UINT32)0x123456);

另外,它不允许您在没有强制转换的情况下传递整数值,从而提高整体可读性并降低错误风险。

0是枚举的一个特例,所以它可以工作。