字符串引用

kr8*_*r85 0 c# string reference

如果ab是同一个对象,为什么不值都引用a变化,当我们改变的值b第三部分.如果我假设(如在第3 部分中)b在我传递一个新的文字字符串时被解除引用,为什么当我传递litaral字符串(返回)时它也不会在第2 部分中取消引用."foo"ReferenceEqualstrue

//part1
string a = "foo";
string b = a;
System.Console.WriteLine("\na = {0}\nb = {1}", a, b); //a=foo b=foo
System.Console.WriteLine("a == b : {0}", a == b);//True
System.Console.WriteLine("ReferenceEquals(a, b): {0}", ReferenceEquals(a, b));//True

//part2
b = "foo";
System.Console.WriteLine("\na = {0}\nb = {1}", a, b);//a=foo b=foo
System.Console.WriteLine("a == b : {0}", a == b);//True
System.Console.WriteLine("ReferenceEquals(a, b): {0}", ReferenceEquals(a, b));//True

//part3
b = "bar";
System.Console.WriteLine("\na = {0}\nb = {1}", a, b);//a=foo b=bar
System.Console.WriteLine("a == b : {0}", a == b);//False
System.Console.WriteLine("ReferenceEquals(a, b): {0}", ReferenceEquals(a, b));//False
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 7

a并且b都指向同一个对象.
但是,你正在改变b,而不是对象.

String 对象是不可变的,不能更改.

当你写作时b = "foo",你正在改变b以引用不同的String实例.


但是,在字符串被拘留,所以写作"foo"总是会给出相同的String实例.

您可以String通过调用String.Copy以下两个具有相同值的不同实例:

string a = "foo";
string b = "foo";
Console.WriteLine(ReferenceEquals(a, b));    //True

b = String.Copy("foo");
Console.WriteLine(ReferenceEquals(a, b));    //False
Run Code Online (Sandbox Code Playgroud)