可能是因为它是不可改变的.
class A
{
public string a;
}
static void Main(string[] args)
{
A a1 = new A();
A b1 = new A();
string a = "abc";
a1.a = "abc";
string b = "ca";
b1.a = "ca";
a = b;
a1 = b1;
b = "cab";
b1.a = "cab";
Console.WriteLine(a);
Console.WriteLine(a1.a);
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
对于a1.a而言,答案是"ca"和"cab",这就是我在面试问题中回答的问题,我将原因解释为字符串的"不变性".
但面试官并不相信.有人可以提供上述代码的令人信服的解释吗?
这种情况与不变性无关.这些都是关于引用类型如何工作的.
在你的;
a = b;
Run Code Online (Sandbox Code Playgroud)
line,your b和areference指向相同的对象,"ca"并且更改b对另一个对象的引用不会影响a指向的对象.
让我试着逐行解释这里发生了什么;
首先,string是参考类型和参考类型有2个部分.一个对象和一个参考到该对象.
在你的
string a = "abc";
Run Code Online (Sandbox Code Playgroud)
你有一个"abc"对象和一个对象的引用a.
string b = "ca";
Run Code Online (Sandbox Code Playgroud)
在这一行中,您有一个"ca"对象和对该对象的引用b.
a = b;
Run Code Online (Sandbox Code Playgroud)
在这条线,现在a参考点相同的对象,该对象b的参考点是"ca".
b = "cab";
Run Code Online (Sandbox Code Playgroud)
在此行中,您将创建一个名为的新对象"cab",您的b引用现在指向此对象.它不再指向"ca"对象.
Console.WriteLine(a);
Run Code Online (Sandbox Code Playgroud)
在这一行中,由于a 仍然引用了"ca"对象,因此将打印此字符串.更改b引用的对象不会影响它.