C#中的ReferenceEquals介绍

当objA和objB是同样实例的时候(或者都是null)会返回true,其他情况会返回false。和Equal不太相同的是这个方法是没有办法override的。所以,假如你想看两个object是否相同,然后又不确认equal是否被override了,那么应该就可以使用这个方法了。

不过有下面两种情况需要注意:

  • 假如比较值类型,也就是说objA和objB都是值类型,我们需要在他们使用ReferenceEquals之前把他们装箱。也就是说,哪怕他们显示的是同样的值类型实例,RefrenceEquals也是返回false的,如下面这个例子所示:
            int a = 3;
            Console.WriteLine(Object.ReferenceEquals(a, a));
            Console.WriteLine(a.GetType().IsValueType);

它返回的值如下:

False 
True

而装箱之后的结果就不一样了:

	            int a = 3;
	            object b = a;
	            Console.WriteLine(Object.ReferenceEquals(b, b));
            Console.WriteLine(b.GetType().IsValueType);

它的返回值如下:

T rue 
rue
  • 当比较string的时候,假如这个string已经interned,那么就会返回true。我们来看下面的代码:
	            String s1 = "String1";
	            String s2 = "String1";
	            Console.WriteLine(Object.ReferenceEquals(s1, s2));
            Console.WriteLine(String.IsNullOrEmpty(String.IsInterned(s1)) ? "No" : "Yes");

这个例子中,其实s1和s2已经是interned,所以他们其实是指向同样的reference,因此就会返回true。

我们再看下面这个例子:

	            String suffix = "test";
	            String s3 = "String" + suffix;
	            String s4 = "String" + suffix;
	            Console.WriteLine(Object.ReferenceEquals(s3, s4));
            Console.WriteLine(String.IsNullOrEmpty(String.IsInterned(s3)) ? "No" : "Yes");

这里哪怕s3,s4他们的值是相同的,但是因为没有interned,所以他们的reference是不同的,因此返回值是false而不是true。

You may also like...

Leave a Reply

Your email address will not be published.