C#中的对象相等性及其比较

时间:2018-10-21 15:00:58

标签: c# .net

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

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具有相同的内容。

Edit1:

问题1:基于默认情况下的一些响应和评论。等于覆盖引用(除非被覆盖),我想理解为什么“ ==”和“ .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”均显示为true。这两个字符串在C#中不是完全不同的吗?

1 个答案:

答案 0 :(得分:0)

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;
  }
}