空参数的行为是不可比较的
本文关键字:可比较 参数 | 更新日期: 2023-09-27 18:18:47
我在我的一个类中实现IComparable
和IComprable<T>
。是否有任何建议如何CompareTo
方法在每种情况下应该表现当给定一个空参数?它应该返回一个正数还是抛出一个ArgumentNullException
?或者这种行为会因实现类的不同而不同吗?
我看到了MSDN文档(这里和这里),但它没有说这个主题。
MSDN对IComparable.CompareTo()
和IComparable<T>.CompareTo()
的引用如下:
根据定义,任何对象比较大于(或小于)
Nothing
,并且两个空引用比较彼此相等。
VB中的Nothing
对应c#中的null
。
注意前一段说:
比较"小于"、"等于"answers"大于"的含义取决于特定的实现。
但是非null的实例引用总是大于null引用,无论你如何比较你的类的实例
我看了MSDN文档,但是它没有提到这个主题
是的,但不是很清楚。文档说明:
根据定义,任何对象都比Nothing大(或在Nothing之后),并且两个null引用相互比较相等。
文档令人困惑,因为它在同一个句子中混合了c# (null)和VB (Nothing)的习惯用法。我要向文档经理提一下。
注意,同样的规则也适用于可空值类型。如果您正在排序一个可为空的整数列表,那么为了排序的目的,1被认为大于null。小心;
确保使用Object.ReferenceEquals
来测试传递给CompareTo
的参数是否为null。避免在CompareTo
方法中使用==
和!=
操作符,因为有人可能会按照MSDN的建议将这些操作符委托给CompareTo
方法,这反过来会创建一个无限循环和堆栈溢出(!)。
这是一个模型,你可以尝试实现一个CompareTo
方法:
public class Piano : IComparable<Piano>
{
public float Mark { get; set; }
public int CompareTo(Piano other)
{
// The very basic implementation of CompareTo
if (object.ReferenceEquals(other, null))
return 1; // All instances are greater than null
return Mark.CompareTo(other.Mark);
}
}
完整的源代码,并解释了这个地址