基本上我在这里想表示字符串是不可变的一个例子,所以我采用下面的例子,我知道GetHashCode()不返回地址,但我如何区分这两个变量引用不同的内存位置?
在下面的代码中,我想要一个字符串变量的地址
string s = "hello";
Console.WriteLine(s.GetHashCode());
s = s + "User";
Console.WriteLine(s.GetHashCode());
但在String Builder中,GetHashCode()返回相同的值
StringBuilder sb = new StringBuilder();
sb.Append("hi");
Console.WriteLine(sb.GetHashCode());
sb.Append("hello");
Console.WriteLine(sb.GetHashCode());
答案 0 :(得分:8)
只需使用两个不同的变量,而不是object.ReferenceEquals
:
string x = "hello";
string y = x + "User";
Console.WriteLine(ReferenceEquals(x, y));
不可否认的是,只需在此时打印x
和y
即可显示出它们的不同......作为一种轻微的选择:
string s = "hello";
string original = s;
Console.WriteLine(ReferenceEquals(s, original)); // True
s = s + "User";
Console.WriteLine(ReferenceEquals(s, original)); // False
也许这比你想要的更接近?
答案 1 :(得分:7)
对于您给出的示例,您实际上并不需要知道地址 - 您只想知道两个对象的地址是否相同。
string s1 = "hi";
string s2 = s1;
Console.WriteLine(object.ReferenceEquals(s1, s2)); // True
s2 = s2 + " world";
Console.WriteLine(object.ReferenceEquals(s1, s2)); // False
有趣的旁注:object
==
运算符默认使用object.ReferenceEquals()
,但因为C#中的string
会覆盖{{1}运算符,检查两个字符串之间的相等性将取决于字符串是否相等。更复杂的是,编译器“实例化”它可以告诉的任何常量字符串在编译时完全相同。这些行为的组合会给你带来一些非常奇怪的行为:
==
答案 2 :(得分:0)
Object.ReferenceEquals(a, b)
返回false
iff a
,b
是对不同对象(以及不同地址)的引用。
字符串构建器的哈希代码可能是从字符串构建器的地址构造的,而不是从它存储的字符串值构造的。
另一方面, s + "hello"
创建一个新对象,其哈希码不同于s
。