我正在实施IComparable
并IComprable<T>
在我的一门课程中。CompareTo
当给定一个空参数时,对于每种情况下的方法应该如何表现,是否有任何建议?它应该返回一个正数还是抛出一个ArgumentNullException
?或者这种行为会因实现类而异?
3 回答
两个 MSDN 参考IComparable.CompareTo()
并IComparable<T>.CompareTo()
陈述了以下内容:
根据定义,任何对象比较大于(或跟随)
Nothing
,并且两个空引用比较彼此相等。
Nothing
在 VB 中对应于null
在 C# 中。
请注意,上一段指出:
比较“小于”、“等于”和“大于”的含义取决于特定的实现。
但是,无论您如何比较类的实例,非 null 的实例引用总是大于 null 引用。
我看到了 MSDN 文档,但在这个问题上没有什么可说的
是的,确实如此,但不是很清楚。该文档指出:
根据定义,任何对象比较大于(或遵循)Nothing,并且两个空引用比较彼此相等。
该文档令人困惑,因为它在同一个句子中混合了 C# (null) 和 VB (Nothing) 的习语。我会向文档经理提到它。
请注意,相同的规则适用于可为空的值类型。例如,如果您正在对可空整数列表进行排序,那么出于排序目的,1 被认为大于空。当心; 这不是 C# 中默认比较可空整数的方式。
确保用于Object.ReferenceEquals
测试传递给的参数是否CompareTo
为空。避免在方法中使用==
和!=
运算符,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);
}
}
完整的源代码以及该地址的解释。