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);
它返回的值如下:
而装箱之后的结果就不一样了:
int a = 3; object b = a; Console.WriteLine(Object.ReferenceEquals(b, b)); Console.WriteLine(b.GetType().IsValueType);
它的返回值如下:
- 当比较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。
Recent Comments