c# - 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# 中不是完全不同吗?
解决方案
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;
}
}
推荐阅读
- html - HTML跳转到页面的特定部分从第二次点击开始工作
- python - 如何使用 twython python 获取超过 100 条推文
- python - 最快的python算法,将数字列表分成N组,最大化每两个最近组的总平均差
- reactjs - 如何使用本地存储单独设置评级?
- cyrillic - 章节标题中的非拉丁符号
- python - 将基于curses的python脚本转换为MacOS App
- json - 某个分支的 git log 漂亮格式
- gnu - 在 iterm2 上使用 GNU coreutils 会禁用 LSCOLORS
- python - 在 Spyder 中启动内核 Python 时发生错误
- c++ - 自定义引用计数指针在创建后立即调用析构函数