通常,应始终对数据使用最特定的数据类型。
例如,如果您正在使用Entity Framework从数据库中提取数据,则EF将自动使用最接近数据库中使用的数据类型。
在C#中有两个问题。
首先,大多数C#开发人员仅使用int
来表示整数(除非有使用的理由long
)。这意味着其他开发人员将不会考虑检查数据类型,因此他们将获得上述的溢出错误。第二,更重要的问题,是/是.NET的原始算术运算符仅支持int
,uint
,long
,ulong
,float
,双,和decimal
*。如今仍然如此(请参见C#5.0语言规范中的 7.8.4节)。您可以使用以下代码自己进行测试:
byte a, b;
a = 1;
b = 2;
var c = a - b; //In visual studio, hover over "var" and the tip will indicate the data type, or you can get the value from cName below.
string cName = c.GetType().Namespace + '.' + c.GetType().Name;
我们的结果byte
- byte
是int
(System.Int32
)。
这两个问题引起了非常普遍的“仅将整数用于整数”的实践。
因此,要回答您的问题,在C#中通常要坚持使用,int
除非:
- 自动代码生成器使用其他值(例如Entity Framework)。
- 该项目上的所有其他开发人员都知道您正在使用不太常见的数据类型(包括一条注释,指出您使用了该数据类型以及原因)。
- 不太常见的数据类型已经在项目中普遍使用。
- 该程序需要使用较少见的数据类型的好处(您有1亿个数据需要保存在RAM中,因此a
byte
和an int
或an int
和a 之间的区别long
很关键,或者已经提到的unsigned的算术区别)。
如果您需要对数据进行数学运算,请遵循常见的类型。
请记住,您可以从一种类型转换为另一种类型。从CPU的角度来看,这可能会降低效率,因此使用7种常见类型中的一种可能会更好,但是如果需要的话,它是一个选择。
列举(enum
)是上述准则的我个人例外之一。如果我只有几个选项,则将枚举指定为字节或短整数。如果需要标记的枚举中的最后一位,则将类型指定为,uint
以便可以使用十六进制设置标记的值。
如果确实使用带有值限制代码的属性,请确保在摘要标签中说明存在哪些限制以及原因。
* C#别名用于代替.NET名称,System.Int32
因为这是一个C#问题。
注意:.NET开发人员有一篇博客或文章(我找不到),该博客或文章指出了算术函数的数量有限以及他们不担心它的一些原因。我记得,他们表示他们没有计划增加对其他数据类型的支持。
注意:Java不支持无符号数据类型,并且以前不支持8或16位整数。由于许多C#开发人员来自Java背景或需要同时使用两种语言,因此有时会人为地将一种语言的限制强加给另一种语言。