重写CompareTo:如何处理空情况
本文关键字:处理 情况 CompareTo 何处理 重写 | 更新日期: 2023-09-27 18:17:49
当给定对象是null
时,CompareTo
方法应该返回什么?
MSDN Library以返回1
为例。但是我希望抛出一个错误,因为与null
比较是不可能的。
我希望对这个答案有不同的看法。什么是最佳实践方法?
是的,有一个最佳实践。与其他答案相反,有一个预期的标准,而不仅仅是最流行的行为。
正确答案在MSDN文档中给出IComparable<T>.CompareTo
和IComparable.CompareTo
:
根据定义,任何对象都比较大于null和两个null引用比较时彼此相等。
(合约上比较大的定义为:if a > b
then a.CompareTo(b) > 0
.)
这种预期的行为在Nullable.Compare<T>
中也得到了证实。Null总是作为小于一个值进行比较。
同样值得注意的是,对于非泛型比较,不匹配的类型不应被视为null:
参数obj必须与类或值类型相同它实现了这个接口;否则,一个ArgumentException是抛出。
这并不影响你的问题,但要注意, Nullable<T> comparison operators
(==
, !=
, <
, <=
, >
, >=
)不遵循IComparable
约定。
当与可空类型进行比较时,如果值为1可空类型的一个为空,另一个为空,所有的比较除
!=
外,求值为false
(不相等)。重要的是不要这样做假定由于特定的比较返回false
,因此反例返回true
。在下面的例子中,10不是大于、小于、不等于null的。只有num1 != num2
计算结果为true
.
还有一个奇怪的结果,(int?)null == (int?)null
计算为真,而(int?)null <= (int?)null
不为真。
选择权在你。想象一个有效的用例,我将某物与虚无进行比较,并希望"某物"被视为更大,这并不超出可能性的范围。但这就是你重写它的原因,所以你可以决定如何处理这种情况
最佳实践将取决于您的具体情况:与null
进行比较可能取决于您正在比较的对象。
如果我定义我的对象,使得null
是任何比较的最低可能值,那么与null
的比较显然是可能的,并且有一个定义良好的结果。在其他情况下,抛出异常可能更有意义。
最终,这是一个(相当主观的)设计问题,它不一定有一个答案。
带null参数的CompareTo会影响对包含空项的列表进行排序的情况。通过在给定对象为null时返回1,使得排序时null出现在列表的顶部,这是最流行的行为。