首页 > 解决方案 > C#中对象的相等性及其比较

问题描述

以下是我正在尝试的示例代码:

namespace ConsoleApplication9
{
    class Program
    {
        public class MyBaseClass
        {
            public string name = "";
        }
        static void Main(string[] args)
        {
            MyBaseClass mybase = new MyBaseClass();
            mybase.name = "n";
            MyBaseClass mybase2 =  new MyBaseClass();
            mybase2.name = "n";
 Console.WriteLine("comparison using == {0}", mybase == mybase2); // prints false, which i understand both object's references are not same 
            Console.WriteLine("Comparions using Equasl {0}", mybase.Equals(mybase2)); // prints False again , Why ??
Console.ReadKey();
        }
    }
}

现在我的理解是 == 运算符比较两个对象的引用,而 .Equals 检查内容是否相同。如果 .Equals 检查内容是否相同,为什么 mybase.Equals(mybase2) 会为我打印 False。两个对象 mybase 和 mybase2 具有相同的内容。

编辑1:

问题1:基于默认情况下 .Equals 检查引用的一些响应和评论,除非被覆盖,我想了解为什么“==”和“.Equals”会为以下代码打印不同的结果:

   object string1 = new string(new char[] { 't', 'e', 's', 't' });
object string2 = new string(new char[] { 't', 'e', 's', 't' });
Console.WriteLine(string1==string2); // prints false
Console.WriteLine(string1.Equals(string2));  // prints true

这里 string1 和 string2 都是独立创建的,因为我的理解是因为 "==" 检查引用它正在打印false,但是为什么 ".Equals" 打印true如果 ".Equals" 默认行为是它也检查引用? ?

问题2:也适用于以下代码:

string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });

Console.WriteLine(a == b); //prints true
Console.WriteLine(a.Equals(b)); // prints true

为什么“==”和“.Equals”都打印为真。这两个字符串在 C# 中不是完全不同吗?

标签: c#.net

解决方案


MyBase.Equals 必须被覆盖。默认情况下 Object.Equals 比较引用

编辑 这是 MyBase.Equals 的一个实现示例,当在 MyBaseClass 的实例上调用 .Equals 时,它会返回 true:

public class MyBaseClass : IEquatable<MyBaseClass>
{
  public string name = "";
  public bool Equals(MyBaseClass other)
  {
    return other != null &&
           name == other.name;
  }
}

推荐阅读