混淆c#中的基本类型和常量
本文关键字:类型 常量 混淆 | 更新日期: 2023-09-27 18:07:09
我们有一个c++代码,它定义了一个统一的命名约定(主要是出于多平台的原因)。
例如:
#define FOO_UINT32 unsigned long
和#define FOO_TRUE true
现在,我们想把其中的一些代码移植到c#中。对于示例中的第一个定义,我发现我需要:
using FOO_UINT32 = System.UInt32;
问题是?第二题怎么做?
由于true
不是一种类型,您不能使用using
指令来别名它。您可以创建带有const
成员的static
类,以获得类似的结果:
public static class PortConstants
{
public const bool FOO_TRUE = true;
}
那么你可以说bool x = PortConstants.FOO_TRUE;
。我建议只使用true
。
您可能还想删除UInt32
的using
别名,因为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是枚举的特殊情况,所以它可以工作。