- 32
- 0
自己尝试写出如下代码,来判断对象相等,虽然能正常工作。
using System;
namespace 比较相等
{
class Program
{
static void Main(string[] args)
{
Pet a1 = new Pet { Name = "Turbo", Age = 8 };
Pet a2 = new Pet { Name = "Turbo", Age = 8 };
if (a1.Equals(a2))
Console.WriteLine("相等");
else
Console.WriteLine("不相等");
Console.Read();
}
}
class Pet
{
public string Name { get; set; }
public int Age { get; set; }
public bool Equals(Pet other)
{
if ((Object) other ==null)
{
return false;
}
return this.Name == other.Name && this.Age == other.Age ;
}
}
}
但是查网上的资料,发现微软官方和其他博客不仅写了 Equals(Pet other),还要重写 override Equals(object obj)。
疑惑 1:
官方说实现特定的 Equals(Pet other)是为了提高性能,这个我勉强能理解。但是为什么还要重写 Equals(object obj)呢? 它的意义何在? 或者说,什么样的情况下,明明已经有了 Equals(Pet other)不会调用 Equals(Pet other),而是去调用 Equals(object obj)?
我尝试模仿官方文档,在 Pet 类中添加了 Equals(object obj),为了强行去调用 Equals(object obj)(疑惑 1 ),还单独创建了一个类 Gdd。
using System;
namespace 比较相等
{
class Program
{
static void Main(string[] args)
{
Pet a1 = new Pet { Name = "Turbo", Age = 8 };
Gdd a2 = new Gdd { Name = "Turbo", Age = 8 };
if (a1.Equals(a2))
Console.WriteLine("相等");
else
Console.WriteLine("不相等");
Console.Read();
}
}
class Pet
{
public string Name { get; set; }
public int Age { get; set; }
public bool Equals(Pet other)
{
if ((Object) other ==null)
{
return false;
}
return this.Name == other.Name && this.Age == other.Age ;
}
public override bool Equals(object obj)
{
if (obj == null )
{
return false;
}
Pet p = obj as Pet;
if ((Object)p == null)
{
return false;
}
return this.Name == p.Name && this.Age == p.Age;
}
}
class Gdd
{
public string Name { get; set; }
public int Age { get; set; }
}
}
疑惑 2:
从逻辑上来说,a1 和 a2 的值是相等的,此时调用的是 Equals(object obj),不过永远返回 false。
如以上代码中完全独立的两个类,怎么写 Equals 方法去判断 a1 和 a2 值相等?
- 共 0 条
- 全部回答
-
画船听雨眠~ 普通会员 1楼
在C#中,Object类已经提供了重写Equals(object obj)方法,以确保类的成员数据的唯一性。重写这个方法可以让你自定义一个对象是否相等的方法。
这个方法接受一个参数obj,它是一个已经存在对象。它会返回一个布尔值,表示这个对象的值是否相等。
以下是一个简单的示例:
```csharp public class Person { public string Name { get; set; } public int Age { get; set; }
public bool Equals(Person other) { if (other == null) { return false; } if (this.Name != other.Name) { return false; } if (this.Age != other.Age) { return false; } return true; }}
public class Program { public static void Main(string[] args) { Person p1 = new Person { Name = "Alice", Age = 30 }; Person p2 = new Person { Name = "Bob", Age = 30 };
Console.WriteLine(p1.Equals(p2)); // 输出: true }} ```
在这个例子中,我们定义了一个Person类,它有两个属性:Name和Age。我们还定义了一个Equals方法,它会比较Person对象的Name和Age属性是否相等。如果是,它返回true,否则返回false。
在main方法中,我们创建了两个Person对象p1和p2,它们的Name和Age属性都相同。因此,我们调用Equals方法,它返回true,这意味着p1和p2是相等的。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

