使用< =而不是==与MinValue进行比较

时间:2010-02-01 21:10:05

标签: c# .net

我刚刚遇到以下代码:

if(someInt <= int.MinValue) { /* ... */ }

我想知道我是否遗漏了一些使用<=比较比使用更直观的==比较更好的微妙之处?

10 个答案:

答案 0 :(得分:9)

这是循环中使用的常用方法 - 而不是(例如)

if (value == max)
    break;

使用

if (value >= max)
    break;

虽然您知道值“永远不应该”大于max,但如果程序逻辑的某些部分错误,并且值传递为(max + 12),会发生什么?第一种情况将尝试在32位系统上循环40亿次;第二种情况一旦意识到你已经通过“最大”位置就会退出。

因此,它是一种更健壮的方式来说同样的事情,因为当一切设置正确时它会起作用,但是当某人搞砸时它也会起作用(或者至少不会发生灾难性的失败)。处理器可以在内部类型执行==的同时执行&gt; =因此没有性能差异。

但是,在将Int与Int.MinValue进行比较时使用&lt; =是多余的(虽然无害),因为在技术上不可能使值小于Int中的值。当然,Int64仍然可以小于Int32.MinValue。

所以我认为这是编码员的“习惯之力”。或者他们不相信Int.MinValue返回最小值: - )

答案 1 :(得分:5)

这是int的最小可能值,似乎没有什么可错过的。使用最直观地读取的代码。

答案 2 :(得分:5)

此外,如果someInt将某一天更改为long,则可能有意义。

答案 3 :(得分:2)

我会说这是一个错误(或者可能是已经改变的遗留物的遗留物,即它最初是int.MinValue以外的值)。

&lt; =与==有着完全不同的含义,只是因为在这个例子中他们实现了同样的事情,我总是写出能够传达代码最清晰意图的东西 - 否则像你这样的人来后来维护它并且必须发布一个SO问题,询问为什么原始开发人员会这样做:)

答案 4 :(得分:1)

它更清楚。 someInt永远不应该&lt; int.MinValue,但是如果它 你不希望测试突然变得错误吗?

通常,当我的代码包含边界测试时,我总是使用&lt ;,&lt; =,&gt;或&gt; =而不是==。即使不可能超出边界。这使 intent 更清晰。

答案 5 :(得分:1)

没有意义。 someInt不可能小于int.MinValue,==就足够了 使用&lt; =只会令人困惑。

答案 6 :(得分:1)

此处的行为相同,但假设您稍后将int.MinValue更改为其他一些小值。使用<=意味着稍后更改。

答案 7 :(得分:0)

如果someInt递减了一些任意数量,则上述代码更有意义。

答案 8 :(得分:0)

我已经看到这种方法被提倡,因为如果出现问题(例如内存损坏),条件仍会触发。这在你的情况下并不是那么有用,但在其他情况下,例如循环计数到10并且内存损坏将值设置为-500,它仍将终止(而不是永远循环,或直到它翻转这可能是很长一段时间)。我不确定我是否认为这是合理的,因为在我看来,处理这类错误的编程很少会做正确的事。

答案 9 :(得分:0)

int.MinValue默认使用Int32类型的最小值。

你的代码很好。我不确定变量some​​Int的初始化。它可以是Int16,Int32或Int64(可以小于int.MinValue)。