当两者都是引用类型时,字符串与类

now*_*ed. 13 .net c# string class immutability

这是我上一次采访的方式:

问题:字符串存储在哪里?

答:堆是因为它是参考类型

问题:请解释以下代码:

static void Main(string[] args)
{
     string one = "test";
     string two = one;
     one = one + " string";

     Console.WriteLine("One is {0}" , one);
     Console.WriteLine("Two is {0}", two);
}
Run Code Online (Sandbox Code Playgroud)

答案:画了两张如下图:

(代表声明, string two = one;

在此输入图像描述

(代表语句, one = one + " string";.在堆上创建一个新字符串并分配)

在此输入图像描述

问题:正确.为下面的代码片段绘制类似的内容:

class Program
{
    static void Main(string[] args)
    {
        Test one = new Test { someString = "test" };
        Test two = one;
        one.someString = "test String";

        Console.WriteLine("One is {0}", one.someString);
        Console.WriteLine("Two is {0}", two.someString);
    }
}

class Test
{
    public string someString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

回答:

[ Test two = one] 在此输入图像描述

one.someString = "test String";
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

问题:好的.你说的这两个stringsclasses是引用类型.那么为什么创建一个新的字符串对象并赋值,而对于类,现有的字符串属性本身会被修改?

答案:因为字符串是不可变的,而类是可变的.

(虽然我清除了采访,但我仍然不明白这种行为.为什么类的设计者在保持字符串不可变的同时使它变得可变?各处都有很多热情的答案,但任何人都可以通过解释这种特殊的行为来简化它用上面的代码?)

dca*_*tro 4

字符串被设为不可变的原因之一(即使它们是引用类型)是为了使它们看起来和表现得像基本类型(例如 int、double、float)。

这也是字符串是唯一可以表示为文字(例如,)的引用类型的原因"some string"。许多其他语言也采用相同的方法,例如 Java。