覆盖类上的==和!=

时间:2011-02-25 14:42:28

标签: c# operator-overloading

有没有办法在类上执行此操作,仍然保留检测Type的变量是否为空的功能?我可以为结构执行此操作,(因为struct不能真正为null,使用结构,而不是将x与null进行比较,您使用单独的方法caleld IsNull或HasValue ...但是您不能将该技术用于类的原因是当类变量为null时,你当然不能调用这样的实例方法!

public class myClass: IEquatable<myClass>
{
    public int IntValue { get; set; }
    public static bool operator ==(myClass cA, myClass  cB)
    { return cA is myClass && cB is myClass && cB.Equals(cA); }
    public static bool operator !=(myClass cA, myClass cB)
    { return !(cA == cB); }       
    public override bool Equals(object o) 
    { return o is myClass && this == (myClass)o; }
    public override bool Equals(myClass o) 
    { return IntValue == o.IntValue; }

} 

但是当我走的时候:

myClass x;
if (x != null)    // this returns false when it should be true 
{
   //code to execute with x here
}

对于它的价值,我希望它成为一个类的唯一原因是因为它参与了一个简单的继承关系。这是一个不可变的类,实际上我在这里要做的就是代码它,它可以表现得像一个不可变和可空的类,就像一个不可变的,可为空的结构行为(如Nullable<int>或{{1等等。

6 个答案:

答案 0 :(得分:5)

这就是为什么IsNull应该是一个带参数的静态方法。 string.IsNullOrEmpty就是一个很好的例子。之后,没有什么可以阻止你将它作为扩展方法。

public class MyClass
{
    public static bool IsNull(MyClass other)
    { return ReferenceEquals(other, null); }
    public static bool HasValue(MyClass other)
    { return !IsNull(other); }
    // other code
}

public static class MyClassExtension
{
   public static bool IsNull(this MyClass myClass)
   {
       return MyClass.IsNull(myClass);
   }
}

这将让您在不抛出的情况下执行以下操作:

MyClass myClass = null;
if(myClass.IsNull())
{
   //...
}

答案 1 :(得分:3)

如果您没有初始化x,那么它是null,则需要执行此操作

 myClass x = new myClass();
 if (x != null) {/* is true */}

答案 2 :(得分:3)

您可以随时使用:

ReferenceEquals(x, null)

返回一个布尔值,显示x是否为空。

答案 3 :(得分:2)

  1. 你根本不应该这样做。
  2. 如果你真的必须,你应该只为不可变的类做这个。然后,
  3. 您应该遵循guidelines

答案 4 :(得分:2)

public class myClass: IEquatable<myClass>
{
    public static bool operator ==(myClass cA, myClass  cB)
    { return (cB == null && cA = null) || (cA is myClass && cB is myClass && cB.Equals(cA)); }
} 

答案 5 :(得分:1)

为什么不覆盖GetHashCode和Equals?

当你覆盖它们时,它允许你很容易地同时做==和!= ..