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

Gun*_*Gun 2 c#

基本上我在这里想表示字符串是不可变的一个例子,所以我采取了下面的例子,我知道GetHashCode()不返回地址,但我如何区分两个变量引用不同的内存位置?

在下面的代码中,我想要一个字符串变量的地址

        string s = "hello";
        Console.WriteLine(s.GetHashCode());
        s = s + "User";
        Console.WriteLine(s.GetHashCode());
Run Code Online (Sandbox Code Playgroud)

但在String Builder中,GetHashCode()返回相同的值

        StringBuilder sb = new StringBuilder();
        sb.Append("hi");
        Console.WriteLine(sb.GetHashCode());
        sb.Append("hello");
        Console.WriteLine(sb.GetHashCode());
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

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

string x = "hello";
string y = x + "User";
Console.WriteLine(ReferenceEquals(x, y));
Run Code Online (Sandbox Code Playgroud)

不可否认只是印刷x,y在那一点上会表明它们是不同的...作为一个轻微的选择:

string s = "hello";
string original = s;
Console.WriteLine(ReferenceEquals(s, original)); // True
s = s + "User";
Console.WriteLine(ReferenceEquals(s, original)); // False
Run Code Online (Sandbox Code Playgroud)

也许那更接近你想要的东西?


Str*_*ior 7

对于您给出的示例,您实际上不需要知道地址 - 您只想知道两个对象的地址是否相同.

string s1 = "hi";
string s2 = s1;
Console.WriteLine(object.ReferenceEquals(s1, s2)); // True
s2 = s2 + " world";
Console.WriteLine(object.ReferenceEquals(s1, s2)); // False
Run Code Online (Sandbox Code Playgroud)

有趣的一面注意:object==运营商默认使用object.ReferenceEquals(),但由于string在C#重写==操作,检查两个字符串之间的平等将基于字符串是否相等.更复杂的是,编译器"实例化"它可以告诉的任何常量字符串在编译时完全相同.这些行为的组合会给您带来一些非常奇怪的行为:

string s1 = "john";
object s2 = "john";
string s3 = new StringBuilder(s1).ToString();
Console.WriteLine(s1 == s2); // True
Console.WriteLine(s2 == s1); // True
Console.WriteLine(s1 == s3); // True
Console.WriteLine(s3 == s1); // True
Console.WriteLine(s2 == s3); // False
Console.WriteLine(s3 == s2); // False
Run Code Online (Sandbox Code Playgroud)