最近审查了一些代码,我(是的,这是第一次)碰到了一个人,而不是像我习以为常的那样初始化... ...
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初始化变量时使用此技术有什么缺点吗?
答案 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;
}
现在,什么时候默认不正确?我可以想到两个原因,
some stuff
是有条件的,因此我优化了我的代码以保存else
T
的默认值是执行some stuff
的有效结果,因此我需要区分。关于你问题的另一个方面,使用常量超过字面值或默认值对性能没有任何损害。
答案 4 :(得分:0)
Long.MinValue
的典型用例是找到范围内的最大值。它作为一个起始条件是好的。然后在循环中,您可以if(currentValue > maxValue) maxValue = currentValue;
如果您在开始时将maxValue
指定为0,则可能只有负值,而在-10,-5和-1之外,您将永远不会得到例如,以-1为单位。