代码改变世界

C# ReferenceEquals,equals,==区别

2012-01-30 18:28  javaspring  阅读(196)  评论(0)    收藏  举报

//程序入口
static void Main()
{
    /* string a = "a";   string b = "a";
     * 此时a,b引用指向堆中的同一地址,因为:
     * .net字符串驻存机制,JIT编译时建一内部列表,发现内有"a"存在,
     * 不分配内存,直接返回引用地址,否则才又重新分配内存^-^
     */
    object a = new string('a',1);
    //string a = new string('a',1);      //分配新内存,返回地址给引用对象a
    object b = new string('a', 1);
    //string  b = new string('a',1);     //分配新内存,返回地址给引用对象b

    Console.WriteLine(ReferenceEquals(a,b));     //false(a,b引用指向地址不同)
    Console.WriteLine(Equals(a,b));              //true(a,b引用指向的地址中存储的值相同)
    
                                                 //false(a,b为除string外的引用类型,==比较引用的地址是否相同)
    if (a == b)                                  //true(string引用类型较特殊,==比较其值相同)
    {
        Console.WriteLine("true");
    }
    else
    {
        Console.WriteLine("false");
    }

    Console.ReadLine();
}

ReferenceEquals:

永远比较2个引用对象所指向的地址是否相同,是比较引用

 

对于2个值类型,ReferenceEquals永远都为false,因为使用ReferenceEquals(object a,object b)方法后

值类型被重新装箱为新的引用类型实例,自然不会引用相等。

 

对于2个引用类型,ReferenceEquals则会比较它们是否指向同一地址。

 

Equals:

永远比较2个对象(无论引用,非引用)的值是否相等,是比较值

 

==:

对于引用对象比较其引用(string引用类型除外,string是比较值)

对于值类型比较其值