Fre*_*ool 10 .net c# icomparable
我正在实施IComparable并IComprable<T>在我的一个课程中.CompareTo在给定null参数时,是否有关于每种情况下该方法应如何表现的建议?它应该返回正数还是抛出ArgumentNullException?或者这种行为可能因实施类而异?
Bol*_*ock 12
两个MSDN引用IComparable.CompareTo()并IComparable<T>.CompareTo()声明以下内容:
根据定义,任何对象都比较大于(或跟随)
Nothing,并且两个空引用相互比较相等.
Nothing在VB中对应null于C#.
请注意,前一段说明:
比较的含义"小于","等于"和"大于"取决于具体实施.
但是,无论您如何比较类的实例,非null的实例引用总是大于null引用.
Eri*_*ert 12
我看过MSDN文档,但在这个问题上没有什么可说的
是的,但不是很清楚.文件说明:
根据定义,任何对象都比较大于(或跟随)Nothing,并且两个空引用相互比较相等.
文档很混乱,因为它混合了同一句子中C#(null)和VB(Nothing)的习语.我会向文档管理员提一下.
请注意,相同的规则适用于可空值的类型.如果要对可空整数列表进行排序,比如说,为了排序,则认为1大于null.小心; 这不是C#中默认值为空的整数比较.
确保使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
整个源代码以及对此地址的解释.