繁体   English   中英

需要重载operator <和null检查

[英]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对象,则应使用注释掉的返回值( falsetrue )。 如果您不打算在混合中允许空值,则抛出ArgumentNullException或允许NullReferenceException将是正确的选择。

两种方法都是正确的(对于不同的正确值)。

如果xy可能为null并且在您的情况下具有有效含义,那么请使用第一种方法。

如果xy极不可能为null,则使用第二个并让任何异常传播到调用代码进行处理。

我个人会抛出一个ArgumentNullException如果xynull ,这应该是一个特例情况。

自定义运算符只不过是静态方法。 此外,一般的操作员通常不应该抛出异常。 这意味着如果MyClass是引用类型,则需要进行空检查。

顺便说一句, nulls常规小于非nulls ,这使得你提出的实现是惯用的。

  1. 在类上重载运算符是个坏主意。 虽然结构没问题。

  2. 如果您决定在类上重载操作符,则必须:
    一种。 在您的逻辑中包含空值检查
    传入null时抛出异常
    C。 不要空检查并允许NullReferenceExceptions(坏)

基本上,在类上重载运算符是个坏主意。 我要么把你的类变成一个结构,要么只实现一个接口,如IComparable<T> / IEquatable<T> ,它在比较中使用空值时有指导。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM