为什么有人用long.MinValue或long.MaxValue初始化变量?

时间:2014-09-19 15:11:24

标签: c#

最近审查了一些代码,我(是的,这是第一次)碰到了一个人,而不是像我习以为常的那样初始化... ...

var thisId = long.minValue

我意识到这个常数的值是负9,223,372,036,854,775,808;也就是十六进制0x8000000000000000。 (http://msdn.microsoft.com/en-us/library/system.int64.minvalue.aspx

如果不满足某些条件,程序员实际上会返回此数字,并且在他的逻辑中使用比较逻辑来测试thisId == long.minValue。

我的第一个想法是,这会导致更多的开销,而不是用ZERO或NULL来初始化变量...但是我得到的情况是你不能有一个可以为空的长度并且可能有一个ZERO值。

那么,在使用long.MinValue或long.MaxValue初始化变量时使用此技术有什么缺点吗?

5 个答案:

答案 0 :(得分:4)

这是一个sentinel value,如果其余代码没有提供更好的值,则保证会出错。与Double.NaN相似。

long 的方法很好,进入 int 的危险区域。我个人从来没有这样做,并且喜欢布尔或可空,保证永远不会导致事故。而且更具可读性。或者只是0,但只有在保证有效值不为零时才能工作。

答案 1 :(得分:2)

为什么有人用long.MinValue初始化它?因为它表明一些特殊的状态。该状态是什么,取决于具体情况。例如,要明确它没有价值'

我个人会对这些情况使用long?(可以为long},因为这会使变量的状态更加清晰。

在我看来,使用long.MinValue的缺点是它本身并不能很好地表明状态。它容易出错,通常只有编写它的程序员才知道它的含义。

答案 2 :(得分:1)

这取决于long.MinValue是否是方法的有效返回值。如果long.MinValue不是返回类型的有效值,并且仅用于表示未找到'返回值,使用可空的long作为返回类型会更好。

在这些情况下使用值(例如0或long.MinValue)而不是null的缺点是引入了幻数。它使代码更难理解,更容易出错。例如,请考虑以下方法:

public int Min(int[] ints);

如果此方法返回int.MinValue怎么办?它有效吗?

或者考虑String.IndexOf方法。如果在字符串中找不到传递的值,则返回-1。虽然没有那么难以猜测-1意味着没有找到,但它仍然在你的代码中引入了幻数-1,因此更难以阅读。我认为String.IndexOf方法只是为了向后兼容而保持这种方式。

答案 3 :(得分:1)

我的答案是,这取决于(像往常一样)。

如果我一般地解决问题,

T SomeFunction<T>()
{
    var result = default(T);

    //// do "some stuff"

    return result;
}

现在,什么时候默认不正确?我可以想到两个原因,

  1. some stuff是有条件的,因此我优化了我的代码以保存else
  2. T的默认值是执行some stuff的有效结果,因此我需要区分。

  3. 关于你问题的另一个方面,使用常量超过字面值或默认值对性能没有任何损害。

答案 4 :(得分:0)

Long.MinValue的典型用例是找到范围内的最大值。它作为一个起始条件是好的。然后在循环中,您可以if(currentValue > maxValue) maxValue = currentValue;如果您在开始时将maxValue指定为0,则可能只有负值,而在-10,-5和-1之外,您将永远不会得到例如,以-1为单位。