[英]needs overload operator< and null check
我在c#中重载了lessthan-operator,我想知道这是否需要检查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对象,则应使用注释掉的返回值( false
和true
)。 如果您不打算在混合中允许空值,则抛出ArgumentNullException
或允许NullReferenceException
将是正确的选择。
两种方法都是正确的(对于不同的正确值)。
如果x
或y
可能为null并且在您的情况下具有有效含义,那么请使用第一种方法。
如果x
和y
极不可能为null,则使用第二个并让任何异常传播到调用代码进行处理。
我个人会抛出一个ArgumentNullException
如果x
或y
为null
,这应该是一个特例情况。
自定义运算符只不过是静态方法。 此外,一般的操作员通常不应该抛出异常。 这意味着如果MyClass
是引用类型,则需要进行空检查。
顺便说一句, nulls
常规小于非nulls
,这使得你提出的实现是惯用的。
在类上重载运算符是个坏主意。 虽然结构没问题。
如果您决定在类上重载操作符,则必须:
一种。 在您的逻辑中包含空值检查
湾 传入null时抛出异常
C。 不要空检查并允许NullReferenceExceptions(坏)
基本上,在类上重载运算符是个坏主意。 我要么把你的类变成一个结构,要么只实现一个接口,如IComparable<T>
/ IEquatable<T>
,它在比较中使用空值时有指导。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.