1. 对象的等值性和唯一性
Sytem .Object 提供的Equals的虚方法,就是提供判断两个对象是否是有着相同的“值“。
e.g
public virtual bool Equals(Object obj)
{
If(this==obj)
return (true);
return false;
}
重写了这个Equals方法
class Car
{
//重写Equals方法
public override bool Equals(object obj)
{
//判断this不能为null
if (obj == null)
return false;
//类型不样 也是不能相等的
if (this.GetType() != obj.GetType())
{
return false;
}
//前面已经判断这个对象是相等的 所以他们不会编译报错的
Car car = (Car)obj;
//对其引用类型字段比较
if (!Object.Equals(this, car))
{
return false;
}
return true;
//return base.Equals(obj);
}
}
2. 对象的唯一性识别 RefenceEquals();
Equals方法是比较两个类型实例是否相等,如果相等的话就true,
而我们如果要将对两对象是否指向同一个引用,将用到RefenceEquals();
static void Main(string[] args)
{
Car c = new Car();
c.Id = 32;
c.Name = "audo";
Car c1 = new Car();
c.Id = 32;
c.Name = "audo";
Console.WriteLine(Object.ReferenceEquals(c, c1));
}
//返回的“false“
说明了对象类型都相同,地址不同。
3. 对象的散列码
说实话,我对这个对象的散列码不是很熟悉,说是点都不同也不为过,不过学习了这个章,还是有好处的。
FCL设计者认为对象的实例都是放入散列集合中的,所以有了Object中的GetHashCode()虚方法
学到了前面的Equals方法时候,我突然的发现:我重载了Equals方法后,vs会给我报一个警告的提示“没有重写Objecet ,GetHashCode()“;我就感到很老火了,我重载了Equals方法关GetHashCode什么事情啊, 不过我重写了GetHashCode() 却没有警告提示;这是为什么呢?
看了下面的章节,我恍然大悟:
一个类型必须同时写入Equals()和GetHashCode();
是因为System.Collections.Hashtable类型的实现要求两个相同的对象都要有相同的散列码,原来是这样的所,我明白了 原来的他们里面的判等和计算等算法是要通过GetHashCode()来保持以致啊!(详情见P163 呵呵)
4. 对象的克隆(浅拷贝和深拷贝)
参见博客中的“浅拷贝和深拷贝解析“……