为什么比较我的两个类返回false?

时间:2010-12-06 08:14:53

标签: c#

我不明白。为什么比较我的类返回false?我想.Equals检查每个元素是否相互= =并且我应该在两个类中分别对我。那么问题是什么?我如何才能做到这一点?

public class MyTest
{
    string me;
    public MyTest(){}
    public MyTest(string v) { me = v; }
    public static implicit operator string(MyTest v){return v.me;}
    public static implicit operator MyTest(string v) { return new MyTest(v); }
    public override string ToString(){ return me;}
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("{0}", new MyTest("a").Equals( new MyTest("a")));
        Console.WriteLine("{0}", new MyTest("a") == new MyTest("a"));
        //false, false

10 个答案:

答案 0 :(得分:14)

类是引用类型。因此,默认的'Equals'方法和相等运算符比较实例的'references'(即内存地址),以验证2个实例是否相等。

换句话说:引用类型上的相等性检查2个实例是否是同一个实例。

您可以通过覆盖Equals和GetHashCode方法来覆盖此行为。此外,您可以重载相等和不等于运算符。

答案 1 :(得分:6)

您需要覆盖Equals方法,因为默认情况下,对于引用类型,它会比较它们的引用:

public override bool Equals(object obj)
{
    var other = obj as MyTest;
    if (other == null)
    {
        return false;
    }
    return other.me == me;
}

同样,当覆盖Equals方法时,最好还是覆盖GetHashCode方法:

public override int GetHashCode()
{
    return (me ?? string.Empty).GetHashCode();
}

答案 2 :(得分:1)

您需要覆盖Equals类上的MyTest方法,并在该方法中实现自定义比较逻辑。如果没有它,默认实现将只比较引用。

请参阅此链接 - Guidelines for Overloading Equals() and Operator == (C# Programming Guide)

答案 3 :(得分:1)

您的班级MyTest实际上并没有超载运营商Equals。所以在你打电话的那一天

Console.WriteLine("{0}", new MyTest("a").Equals( new MyTest("a")));

默认情况下,只是做与==相同的事情。

您需要在类中明确定义相等,如下所示:

public override bool Equals(Object obj)
{
    return (MyTest)obj.me == this.me;
}

实际上会将此对象内的字符串与另一个内部的字符串进行比较。现在,调用.Equals和使用==运算符都将使用您定义的相等。

编辑:有关更全面的解决方案,请参阅@Darin Dimitrov的答案。

答案 4 :(得分:1)

你不是比较两个类,而是两个不同的类实例;测试返回false,因为您正在比较两个不同的引用。

您可以覆盖此行为,覆盖EqualsGetHashCode

答案 5 :(得分:1)

struct默认情况下会比较字段; class默认比较引用。这并不意味着您只需将其设为struct,以避免拳击等,您还需要覆盖GetHashCodeEquals 无论如何(加{ {1}}) - 当您完成此操作时,您可以为现有代码完成此操作。

例如:

ToString

答案 6 :(得分:0)

引用类型的等于和'=='查看两个对象是否指向同一引用。它不会检查类的值。您必须重写equals(或实现IEquatable)以提供您自己的逻辑来与类的实例进行比较

答案 7 :(得分:0)

您必须覆盖object.Equals(和GetHashCode)。如果不覆盖默认实现,则返回它们是否是同一个对象(而不是比较字段)。

答案 8 :(得分:0)

为什么不使用结构(这是一种值类型,并通过其各部分的比较总和进行比较

public struct MyTest
{
    string me;
    public MyTest(string v) { me = v; }
    public static implicit operator string(MyTest v) { return v.me; }
    public static implicit operator MyTest(string v) { return new MyTest(v); }
    public override string ToString() { return me; }
}

答案 9 :(得分:-2)

据我所知,默认情况下“==”确定2个对象是否相同;和“等于”比较他们的价值观。