我想确定一下。如果我在类型类的两个操作数之间应用==运算符,当两个变量都指向同一个对象时,它返回true? 也像在字符串类中一样,基于例如检查相等性。一些值,我需要覆盖该运算符。这是真的吗?
答案 0 :(得分:2)
==的默认实现在引用类型上使用引用相等性,即当且仅当它们是同一个实例时,对象才相等。
您可以重载==
和!=
运算符。如果您这样做,为了保持一致性,您还应该覆盖Equals
和GetHashCode()
。如果您不重写这些,则只能使用==
和!=
获得正确的相等性,但Dictionary
或HashSet
等许多其他用途仍将使用引用相等性。
您始终需要一起重载==
和!=
。通常我会在==
中编写比较结果并使用==
表达其他比较。
public static bool operator ==(MyClass x, MyClass y)
{
}
public static bool operator !=(MyClass x, MyClass y)
{
return !(x==y);
}
public override bool Equals(object obj)
{
if((obj==null)||(obj.GetType()!=typeof(MyClass))
return false;
return this==(MyClass)obj;
}
public override int GetHashCode()
{
}
你应该考虑让这个类不可变。当对象在HashSet或Dictionary中时,平等不能改变,并且使其完全不可变会节省很多麻烦。而且由于你只能使用不可变类来实现价值语义,而重写等式的目标是获得价值语义,你基本上需要不变性。
答案 1 :(得分:2)
是,==运算符比较引用是否指向同一个对象。
在字符串中,它比较equality(与Java不同)
答案 2 :(得分:1)
==
将对实例x
和y
返回true:
x
和y
属于同一类型x
和y
或者是同一个实例,或者它们所代表的类型重载==
运算符,并且根据它们进行比较。答案 3 :(得分:1)
对于第二个问题,要赋予==一个特殊含义,你确实需要重载(而不是覆盖)运算符(和!=同时):
public class Test
{
public static bool operator ==(Test t1, Test t2)
{
// Insert logic here, being careful of the possibility of
// t1 and t2 being null. And don't just use if (t1 == null)
// - it will recurse!
}
public static bool operator !=(Test t1, Test t2)
{
// Usual way of implementing
return !(t1 == t2);
}
}
如果你超载==你几乎肯定也应该:
IEquatable<T>
答案 4 :(得分:0)
这是来自MSDN的完整explanation 是的,它确实比较了类/对象实例的引用。