对类类型操作数使用==运算符

时间:2011-03-03 08:58:39

标签: c# .net operators operator-overloading

我想确定一下。如果我在类型类的两个操作数之间应用==运算符,当两个变量都指向同一个对象时,它返回true? 也像在字符串类中一样,基于例如检查相等性。一些值,我需要覆盖该运算符。这是真的吗?

5 个答案:

答案 0 :(得分:2)

==的默认实现在引用类型上使用引用相等性,即当且仅当它们是同一个实例时,对象才相等。

您可以重载==!=运算符。如果您这样做,为了保持一致性,您还应该覆盖EqualsGetHashCode()。如果您不重写这些,则只能使用==!=获得正确的相等性,但DictionaryHashSet等许多其他用途仍将使用引用相等性。

您始终需要一起重载==!=。通常我会在==中编写比较结果并使用==表达其他比较。

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)

如果出现以下情况,

==将对实例xy返回true:

  • xy属于同一类型
  • xy或者是同一个实例,或者它们所代表的类型重载==运算符,并且根据它们进行比较。

答案 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>
  • 很可能让你的课程密封且不可改变(可以改变的平等是令人不安的)
  • 覆盖等于(对象)和GetHashCode

答案 4 :(得分:0)

这是来自MSDN的完整explanation 是的,它确实比较了类/对象实例的引用。