通用对象操作

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.  对象的克隆(浅拷贝和深拷贝)

参见博客中的“浅拷贝和深拷贝解析“……

原文地址:https://www.cnblogs.com/renjie/p/1408183.html