为什么有人会用long初始化一个变量.MinValue或long.最大值

本文关键字:long 一个 变量 MinValue 最大值 为什么 初始化 | 更新日期: 2023-09-27 18:23:40

最近查看一些代码时,我(是的,这是第一次)遇到有人初始化了一个与我习惯的不同的东西…

var thisId = long.minValue

我知道这个常数的值是负9223372036854775808;即十六进制0x8000000000000000。(http://msdn.microsoft.com/en-us/library/system.int64.minvalue.aspx)

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

我的第一个想法是,与用ZERO或NULL初始化变量相比,这会导致更多的开销。。。但我知道可能有一种情况,你不能有一个可以为null的long,并且一个值可能有一个ZERO。

那么,在用long初始化变量时,使用这种技术有什么缺点吗。MinValue或long。最大值?

为什么有人会用long初始化一个变量.MinValue或long.最大值

这是一个sentinel值,如果代码的其余部分没有找到更好的值,那么它肯定是错误的。类似于Double.NaN.

这种方法对于是可以的,对于int则进入危险区。我个人从来没有这样做过,我喜欢bool或nullable,保证永远不会以这种方式引发事故。而且可读性更强。或者当然只有0,但只有在有效值保证为非零的情况下才能工作。

为什么有人用long.MinValue初始化它?因为它表示某种特殊的状态。这种状态是什么,取决于上下文。例如,为了明确它"没有值"。

就我个人而言,我会在这些情况下使用long?(一个可为null的long),因为这会使变量的状态更加清晰。

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

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

如果我一般地处理这个问题,

T SomeFunction<T>()
{
    var result = default(T);
    //// do "some stuff"
    return result;
}

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

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

关于你问题的另一个方面,使用常量而不是文字或默认值不会损害性能。

这取决于long.MinValue是否是该方法的有效返回值。如果long.MinValue不是返回类型的有效值,并且仅用于发出"未找到"返回值的信号,则最好使用可为null的long as返回类型。

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

public int Min(int[] ints);

如果这个方法返回int.MinValue怎么办?它有效与否?

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

Long.MinValue的典型用例是在该范围内找到一个最大值。这是一个良好的开始条件。在循环中,您可以执行if(currentValue > maxValue) maxValue = currentValue;。例如,如果在开始时将maxValue分配给0,则可能只有负值,而在-10、-5和-1中,您永远不会得到-1。