混淆c#中的基本类型和常量

本文关键字:类型 常量 混淆 | 更新日期: 2023-09-27 18:07:09

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

#define FOO_UINT32 unsigned long
#define FOO_TRUE true

现在,我们想把其中的一些代码移植到c#中。对于示例中的第一个定义,我发现我需要:

using FOO_UINT32 = System.UInt32;

问题是?第二题怎么做?

混淆c#中的基本类型和常量

由于true不是一种类型,您不能使用using指令来别名它。您可以创建带有const成员的static类,以获得类似的结果:

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

那么你可以说bool x = PortConstants.FOO_TRUE;。我建议只使用true

您可能还想删除UInt32using别名,因为CLR类型不会改变,并且在可用CLR实现的平台上是一致的。

你需要定义一个常量,这是最接近的。

public const bool FOO_TRUE = true;
还要注意,using处理类型别名的"技巧"只适用于在中定义的文件

现在,更大的问题是,你是移植还是转换?通过移植,我的意思是您想要保留尝试将原始源库的更新合并到移植中的能力。

通过转换,你基本上是重新实现功能。

如果你正在做后者,你应该放弃这些"技巧",选择c#/。. NET方法来代替。

请注意,如果您在代码中使用UInt32,该类型将永远不会根据平台更改为16位或64位,它将始终是32位和无符号的。因此,在。net和c#中,使用这样的别名类型来处理平台不一致性的需求大大减少了,所以我的建议是完全放弃这种类型别名,而使用UInt32

FOO_TRUE也是如此,true将永远是bool类型,无论平台。

对于前进代码,最好的方法是使用您正在编程的平台的习惯用法。

好吧,我建议不要这样做…在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
}

带有consts的静态类

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

c#确实提供了一个#define指令,但是

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

你最好创建一个静态类并像这样定义它们:

public const bool FOO_TRUE = true;

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

在c++中这是一个坏主意,在c++中至少应该使用typedef。在c#中,它没有意义,因为可移植性是由底层平台保证的。别这么做

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

[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是枚举的特殊情况,所以它可以工作。