如何获取参考变量的地址?

时间:2013-07-03 17:54:02

标签: c#

基本上我在这里想表示字符串是不可变的一个例子,所以我采用下面的例子,我知道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());

3 个答案:

答案 0 :(得分:8)

只需使用两个不同的变量,而不是object.ReferenceEquals

string x = "hello";
string y = x + "User";
Console.WriteLine(ReferenceEquals(x, y));

不可否认的是,只需在此时打印xy即可显示出它们的不同......作为一种轻微的选择:

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 ab是对不同对象(以及不同地址)的引用。

字符串构建器的哈希代码可能是从字符串构建器的地址构造的,而不是从它存储的字符串值构造的。

另一方面,

s + "hello"创建一个新对象,其哈希码不同于s