为什么字符串不像引用类型那样?

Dee*_*hra -1 c# string

可能是因为它是不可改变的.

    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",这就是我在面试问题中回答的问题,我将原因解释为字符串的"不变性".

但面试官并不相信.有人可以提供上述代码的令人信服的解释吗?

Son*_*nül 8

这种情况与不变性无关.这些都是关于引用类型如何工作的.

在你的;

a = b;
Run Code Online (Sandbox Code Playgroud)

line,your bareference指向相同的对象,"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引用的对象不会影响它.

  • 很好的解释.@Deepak Mishra:"谢谢"和/或点击接受按钮会更合适. (4认同)