Net复习笔记:第八部分:对象判等

对象判等主要包含了四种方法

1. public virtual bool Equals(object obj)   虚方法比较对象实例是否相等

2.public static bool Equals(object objA,object objB)  静态方法比较对象实例是否相等

3. public static  bool ReferenceEquals(object objA,object objB)  静态方法比较两个引用是否相等

4.==比较对象实例是否相等

 

判等解析

 

  1. 1.      静态方法Equals(object objA,object objB)的判等
  2. public static bool Equals(object objA, object objB)
  3.         {
  4.             return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
  5.         }

根据net的实现代码我们可以看到,静态方法的判等主要和三个方面有关系,第一个是,是否是同一个实例,第二个是,是否是都为空,第三个是,第一个参数的Equals虚方法

namespace NetNiBiXiuZhiDao

{

    public partial class WebForm14 : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            MyclassA mya = new MyclassA();

            MyClassB myb = new MyClassB();

            Response.Write(Equals(mya, myb)) //输º?出?的Ì?为true;

            Response.Write(Equals(myb, mya)) //输º?出?的Ì?为false;

        }

    }

    class MyclassA

    {

        public override bool Equals(object obj)

        {

            return true;

        }

    }

    class MyClassB

    {

        public override bool Equals(object obj)

        {

            return false;

        }

    }

}

2.ReferenceEquals方式判等

net中referenceEquals的实现代码为

public static bool ReferenceEquals(object objA, object objB)

        {

            return (objA == objB);

        }

Response.Write(ReferenceEquals(1,1));输出的为false,因为ReferenceEquals只能比较引用类型,所以值类型用ReferenceEquals必然发生拆箱和装箱,所以内存地址肯定不同

但是       string Stra = "ABC";

            string Strb = "ABC";

            Response.Write(ReferenceEquals(Stra, Strb));返回的为true

看以看出stra和strb不但内容相同还有相同的引用地址,这个是因为string的字符串驻留机制

 

 

3.Equals虚方法方式判等

NetEquals的实现代码为

public bool Equals(string value)

        {

            if (this == null)

            {

                throw new NullReferenceException();

            }

            if (value == null)

            {

                return false;

            }

            return (object.ReferenceEquals(this, value) || EqualsHelper(this, value));

        }

我们可以看出:1.如果是null使用虚方法Equals就会报错,2.如果是比较的值是null哪肯定是false,3.用于比较的两个值,如果是引用类型就比较那个比较对象的引用地址,如果是值类型就比较他们的值

 

 

在对象的判等中,ReferenceEquals是只能判断引用类型(也可以判等string类型),而Equals==是对象是值类型的时候比较的是两个对象的值,对象是引用类型的时候比较的是对象的引用

 

posted @ 2014-01-23 16:53  瀚海行舟  阅读(98)  评论(0编辑  收藏  举报