zoukankan      html  css  js  c++  java
  • C#编程(三十九)----------比较对象的相等性

    比较对象的相等性

    需要理解对象相等的机制对逻辑表达式的编程很重要,另外,对实现运算符重载和类型强制转换也很重要.

    对象相等的机制有所不同,这取决于比较的是引用类型还是值类型.

    比较引用类型的相等性

    System.Object定义了三个不同的方法来比较对象的相等性:ReferenceEquals()Equals()两个版本,再加上比较运算符,实际上有四种进行相等比较的方式.

    1.ReferenceEquals()方法

    以下是ReferenceEquals()方法的定义

    public static bool ReferenceEquals(object objA, object objB)

    ReferenceEquals()是一个静态方法,测试两个引用是够引用类的同一个实例,特别是两个引用是否包含内存中的相同地址.作为静态方法,他不能重写,所以System.Object的实现代码保持不变.如果提供的两个引用引用同一个对象实例,ReferenceEquals()总是返回true;否则就返回false.但是它默认 null等于null;

    案例:

    SomeClass x,y;

    x=new SomeClass();

    y=SomeClass();

    bool b1=ReferenceEquals(null,null)  //返回真

    bool b2=ReferenceEquals(null,x)  //返回假

    bool b3=ReferenceEquals(x,y)  //返回假,因为xy指向不同的对象

    2.虚拟的Equals()方法

    以下是Equals()方法的定义:

    public virtual bool Equals(object obj)

    返回一个值,该值指示当前的object是否等于当前的object.

    Equals的默认实现仅支持引用相等,但派生类可重写此方法一直吃值相等.

    在下面的列表中,x,y,z表示不为空的引用:

    (1)除设计浮点型的情况外,x.Equals(x)都返回true

    (2)x.Equals(y)返回与y.Equals(x)相同的值

    (3)如果xy都为NaN,x.Equals(y)返回true.

    (4)当且仅当x.Equals(z)返回true,(x.Equals(y)&&y.Equals(z))才返回相同的值

    (5)只要不修改xy引用的对象,x.Equals(y)的相机调用将返回相同的值

    (6)x.Equals(null)返回false

    案例:

        public class Sample

        {

            public  void Method()

            {

                object obj1 = new object();

                object obj2 = new object();

                Console.WriteLine(obj1.Equals(obj2));//返回假

                obj2 = obj1;

                Console.WriteLine(obj1.Equals(obj2));//返回真

                Console.ReadKey();

            }

    }

    3.静态的Equals()方法

    以下是静态的Equals()方法的定义

     public static bool Equals(object objA , object objB)

    如果objA是与objB相同的实例,或者如果两者均为空引用,或者如果objA.Equals(objB)返回true,则为true ,否则为false.

    值类型的相等比较

    在进行值类型的相等比较的时,采用与引用类型相同的规则:ReferenceEquals()用于比较引用,Equals()用于比较值.最大的区别是,值类型需要装箱才能把他们转换为引用,才能对他们执行方法.

    ReferenceEquals()在应用值类型时,总是返回false,因为为了调用这个方法,值类型需要装箱到对象中.即使使用下面的代码:

                int v = 10;

                bool b = ReferenceEquals(v, v);

                Console.WriteLine(b);//b返回false

    因为在转换每个参数时,v都睡被单独装箱.

  • 相关阅读:
    [转载]实战经验:IIS网站服务器性能优化攻略
    如何检测本页中的iframe是否“加载”完成
    悟透JavaScript读书笔记闭包与原型
    HttpConnection访问时ArrayIndexOutofBoundException的解释[javaME]
    [JavaME]手机同时播放两个音乐 探讨一
    封装MIDP 1.0 HttpConnection用于商业应用[javaME]
    Nokia S60真机的全屏getHeight()返回值BUG说明
    [JavaME]在高级UI上的keyPressed事件截获的说明
    手机同时播放两个音乐 探讨二[JavaME]
    Bloglines手机伴侣开发纪事[1][j2me]
  • 原文地址:https://www.cnblogs.com/android-blogs/p/6598699.html
Copyright © 2011-2022 走看看