以下是我正在尝试的示例代码:
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#中不是完全不同的吗?
答案 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;
}
}