C# ReferenceEquals,equals,==区别

本文通过一个具体的C#代码示例介绍了如何区分ReferenceEquals与Equals方法的使用场景,详细解释了两者在比较引用类型及值类型的区别。

//程序入口
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是比较值)

对于值类型比较其值


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值