总结:
1、对于引用类型,我们要定义“值相等性”,应该仅仅去重载equals
2、根据目前的了解RfrenceEquals只使用于直接比较字符串(那为啥我不直接用==来比较字符串呢?),不适合类和int类型
3、重写Equals方法的同时,也应该实现一个类型的接口IEquatable<T>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PromoteDay05
{
class Program
{
static void Main(string[] args)
{
/*
* 总结:1、对于引用类型,我们要定义“值相等性”,应该仅仅去重载equals
* 2、根据目前的了解RfrenceEquals只使用于直接比较字符串(那为啥我不直接用==来比较字符串呢?),不适合类和int类型
* 3、重写Equals方法的同时,也应该实现一个类型的接口IEquatable<T>
建议11:区别对待 == 和Equals
原则:1、对于值类型,如果类型的值相等,就应该返回True
2、对于引用类型,如果类型指向同一个对象,则返回True
*/
/*
建议12:重写Equals时也要重写GetHashCode
*/
Person p1 = new Person("123");
Person p2 = new Person("123");
Console.WriteLine(p1 == p2);
Console.WriteLine(p1.Equals(p2));
string s1 = "123";
string s2 = "123";
int i1 = 5;
int i2 = 5;
bool i = object.ReferenceEquals(i1, i2);
Console.WriteLine(s1 == s2);
Console.ReadKey();
}
public class Person : IEquatable<Person>
{
public string IdCode { get; set; }
public Person(string idCode)
{
this.IdCode = idCode;
}
//因为类是引用类型,包括object基类,所以默认实现的比较方法也认为他俩不是同一个对象,
//指向这个类的指针不同,但是可以通过重写equals来判断两个对象是否为同一对象。
public override bool Equals(object obj)
{
return (obj as Person).IdCode == IdCode;
}
public override int GetHashCode()
{
return (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName + "#" + this.IdCode).GetHashCode();
}
public bool Equals(Person other)
{
return other.IdCode == this.IdCode;
}
}
}
}