为什么有人会用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。最大值?
这是一个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;
}
现在,默认值什么时候会不正确?我能想到两个原因,
some stuff
是有条件的,所以我优化了代码以保存else
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。