需要重载运算符<;和空检查
本文关键字:检查 lt 重载 运算符 | 更新日期: 2023-09-27 18:27:13
我正在重载c#中的lesssthan运算符,我想知道这是否需要检查null。下面你可以找到一个例子:
public static bool operator <(MyClass x, MyClass y)
{
if (x == null && y == null)
{
return false;
}
if (x == null)
{
return true; //false?
}
if (y == null)
{
return false; //true?
}
return x.Value < y.Value;
}
或者这是正确的:
public static bool operator <(MyClass x, MyClass y)
{
return x.Value < y.Value;
}
我没有找到任何关于这方面的说明。但也许我错过了什么。
答案取决于您的预期使用模式。如果您计划在混合中使用null,并且希望null
值小于非null值,那么您的实现是正确的;如果您希望null
的值大于非null对象,那么应该使用注释掉的返回值(false
和true
)。如果您不打算在混合中允许null,那么抛出ArgumentNullException
或允许NullReferenceException
将是正确的选择。
这两种方法都是正确的(对于correct的不同值)。
如果x
或y
可能为null,并且在您的情况下这具有有效的含义,那么使用第一种方法。
如果x
和y
极不可能为null,则使用第二个,并让任何异常传播到调用代码进行处理。
就我个人而言,如果x
或y
是null
,我会抛出一个ArgumentNullException
,这应该是一种特殊情况。
自定义运算符只不过是一个静态方法。此外,一般情况下,运算符不应该抛出异常。这意味着如果MyClass
是引用类型,则需要这些null检查。
顺便说一句,nulls
小于非nulls
是惯例,这使得您提出的实现习惯化。
在类上重载运算符是个坏主意。不过这对structs来说没问题。
如果您决定在类上重载运算符,则必须:
a.在逻辑中包含空检查
b.传入null时抛出异常
c.不要进行空检查并允许NullReferenceException(坏的)
基本上,在类上重载运算符是个坏主意。我要么把你的类变成一个结构,要么只实现一个接口,比如IComparable<T>
/IEquatable<T>
,它在比较中使用空值时有指导原则。