C# 覆盖==和!=在课堂上
是否有任何方法可以在类上执行此操作,并且仍然能够检测该类型的变量是否为null?我可以对structs这样做,(因为struct不能真的为null,对于struct,不必将x与null进行比较,您可以使用单独的方法caleld IsNull或HasValue…但是您不能对类使用该技术,因为当类变量为null时,您当然不能对其调用这样的实例方法C# 覆盖==和!=在课堂上,c#,operator-overloading,C#,Operator Overloading,是否有任何方法可以在类上执行此操作,并且仍然能够检测该类型的变量是否为null?我可以对structs这样做,(因为struct不能真的为null,对于struct,不必将x与null进行比较,您可以使用单独的方法caleld IsNull或HasValue…但是您不能对类使用该技术,因为当类变量为null时,您当然不能对其调用这样的实例方法 public class myClass: IEquatable<myClass> { public int IntValue { g
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; }
}
值得一提的是,我希望它成为一个类的唯一原因是因为它参与了一个简单的继承关系。这是一个不可变的类,实际上我在这里要做的是对它进行编码,这样它就可以像一个不可变的、可为null的类一样工作,就像一个不可变的、可为null的结构一样(例如
Nullable
或Nullable
等。如果您没有初始化x
,那么它是null
,您需要执行此操作
myClass x = new myClass();
if (x != null) {/* is true */}
这就是为什么
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())
{
//...
}
为什么不重写GetHashCode和Equals呢 当您同时覆盖它们时,它允许您非常轻松地同时执行==和!=操作。您始终可以使用:
ReferenceEquals(x, null)
这将返回一个布尔值,显示x是否为null。公共类myClass:IEquatable
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)); }
}
{
公共静态布尔运算符==(myClass cA,myClass cB)
{return(cB==null&&cA=null)| |(cA是myClass&&cB是myClass&&cB.Equals(cA))}
}
只是在这里大声思考一下,但是当cA或cB为空时,总是在重载中返回true有什么缺点呢?is
操作符调用public static bool操作符==(myClass cA,myClass cB){返回cA是myClass&&cB是myClass&&cB.Equals(cA);}
不需要。1)感谢您的帮助。2)我需要这样做。3)这种类型是不可变的。4) 请遵守您的指导原则。无论x是否为null,写入(x!=null)都会调用my operator override中的代码…添加了更多代码以使此显式。。。但是=
不是标准的.net=代码>。。。。它正在运行我对的覆盖=代码>。因此,变量是否为null与此无关。正是我的覆盖中的代码控制着的内容=
方法将返回。是的,但是中的是
比较失败,因为第二个参数是null
,我不明白当对象是null
是时,为什么期望null检查返回false,这正是问题所在。。。如何在每次调用==
或时检查空值=代码>被重新路由到我的覆盖…结合下面@jjrdk的ReferenceEquals建议,我认为这会起作用。。谢谢哦非常感谢。我在自己做这件事时犹豫不决,所以我改为+1他感谢您的接受。希望我能检查两个答案作为解决方案,您的答案,加上下面的硬币,最终成为解决方案。。。谢谢
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)); }
}