使用适当的数据类型是一种好习惯吗?

时间:2015-02-18 16:21:31

标签: c# performance types

这可能是一个愚蠢的问题,但这里是:

我不确定这是习惯,懒惰还是正确的事情。但是我发现自己使用了我根本不需要使用的数据类型,为了保持一致性,以及稍后编写更容易编码的东西(即转换数据类型)。

让我举个例子:

public int Number1 { get; set; }

Number1只是一个常规的整数,但想象一下总是(或必须)为正数的情况,所以我实际上可以使用uint而不是int。

然而,使用大量不同数据类型的问题之一是必须使用显式转换的风险,因此我会有很多嘈杂的代码。使用诸如int之类的常见数据类型有助于降低噪音,但与铸造相比,这会对应用程序的整体性能产生任何影响吗?

int one = 2;
uint two = 1;

one = (int)two;

这种噪音不一定是坏事,但可能令人沮丧。也可能存在一个问题,即uint可能高于int的最大值。

我发现在很多例子中,int似乎是一个非常常用的数据类型,用于处理整数,我很少看到其他数据类型被使用。这是为什么?

使用'不正确'数据类型有什么问题,使用int,而不是uint或short等更有效吗?

提前致谢。

3 个答案:

答案 0 :(得分:4)

最佳做法是不要仅根据您要表示的实体的性质使用有符号或无符号数字,而是实际 声明一种全新的数据类型 对于您正在处理的每种不同类型的实体。

因此,例如,温度需要有符号数,但最佳做法是声明一个新的温度"值类型。 (struct Temperature

C#的美妙之处在于:

  1. 如果您的struct Temperature只包含float,它将占用与浮点数完全相同的内存,并且效率与float一样高。 (整个struct将在注册表中传递,就像float一样。)

  2. 您可以重载运算符,包括类型转换运算符,包括隐式类型转换运算符,因此如果您的温度需要可以与其他类型的实体自由互换,您可以重载相应的运算符并实现这一点,无需任何类型转换。 (见https://msdn.microsoft.com/en-us/library/85w54y0a.aspx

  3. 然而,应该注意的是,数据类型之间的自由互换性首先违背了将它们声明为单独数据类型的目的。你应该做的是在类型本身中封装尽可能多的操作,以便最小化需要将类型转换为其他类型的情况。

    <强> 修订

    为您正在处理的每种不同类型的数量定义特殊数据类型的做法是从物理学家的实践中得出的,并且始终遵循该术语单位的方程的每个单项。因此,长度永远不仅仅是一个普通的5值,它始终是5 metres值(在SI中),加速度也不仅仅是一个普通的9.8值,它总是一个{ {1}}价值。当错误发生时,这往往会使其非常明显,从而最大限度地减少发生错误的可能性。例如,试图在期望米的等式中使用以厘米为单位的值,并且(甚至更重要的是)尝试在期望加速度值的等式中使用速度值。有关此内容的详细信息,请参阅:https://physics.stackexchange.com/q/138841

    明显的错误也是匈牙利符号的初衷(见https://en.wikipedia.org/wiki/Hungarian_notation),尽管当时C语言不可能为每种值定义不同的数据类型并保持性能。所以,他们只是摆弄了变量的名称。

    对于像C#这样的现代语言,我们最终可以声明我们自己的有效类型,这样数据类型替换错误不仅更容易捕获,而且实际上无法实现。

答案 1 :(得分:2)

在查看效果之前,请查看此作业是否损害了您的计划的正确性:

one = (int)two;

它有可能溢出int,这比简单地丢失几个CPU周期要糟糕得多。

如果你知道没有溢出,因为你已经清理了unsigned个变量的值(在这种情况下,two小于或等于int.MaxValue)那么你不妨使用int。采用无符号数据类型的原因是获得额外的位,或者使所有操作将数字视为unsigned,而不是为了获得性能或进行隐式验证。

答案 2 :(得分:0)

在.NET Framework中,即使是正值或零值,Microsoft选择使用int或long代替uint或ulong。原因:因为更容易避免有符号和无符号类型之间的类型转换,以及对无符号整数可能暗示的减法符号更改的潜在异常。

那么,在int上只使用posivite或零值是什么意思:只使用32位中的31位。不是问题:我们有很多记忆。

如果要存储二进制数据,这可能会成为问题,在这种情况下,您将通常使用无符号字节。数据大小对于非常大的数据存储和慢速媒体上的通信也很重要。将编写一些优化的算法以最小化内存使用,并且还将使用无符号值。

什么是好的做法:如果你使用0到2 000 000 000之间的值,使用int,如果你想要易于使用,使用int或longs。如果内存使用情况影响,媒体带宽使用是至关重要的,数据是二进制的(图像位,声音,...)或算法效率需要使用uint或ulong,使用它们但在减法期间要小心:减去高于数字的数字第一个操作数将抛出ArithmeticOverflowException。