有没有办法在类上执行此操作并且仍然保留检测 Type 的变量是否为 null 的能力?我可以对结构执行此操作,(因为结构不能真的为空,对于结构,而不是将 x 与空进行比较,您可以使用单独的方法 caleld IsNull 或 HasValue ...但是您不能将该技术与class cause 当类变量为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
}
就其值(value)而言,我希望它成为一个类的唯一原因是因为它参与了一个简单的继承关系。这是一个不可变类,实际上我在这里尝试做的是对其进行编码,以便它可以表现得像一个不可变和可为 null 的类,完全像一个不可变、可为 null 的结构的行为(例如 Nullable<int>
或 Nullable<float>
等。
最佳答案
这就是为什么 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())
{
//...
}
关于c# - 在类上覆盖 == 和 !=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5118521/