为什么字符串的类型表现得像值类型?

Ahm*_*kan -1 c# boxing value-type reference-type

我对参考类型非常困惑。我搜索并看到字符串类型是引用类型。不是 ?

我的问题是:

我将一个字符串变量复制到另一个,并更改了第一个的值,但是第二个的值仍然相同。我不明白这个问题。即使字符串的类型是引用类型,第二个也不会改变。我也尝试了装箱方法,但无法获得结果。

我读了这篇文章在 C# 中,为什么 String 是一种行为类似于值类型的引用类型?,但是我仍然感到困惑。

这是我的代码:

        string my_text1 = "My text 1";
        string my_text2 = my_text1;

        my_text1 = "My text 2";
        Console.WriteLine("First text --> " + my_text1); // It prints My text 2
        Console.WriteLine("Second text -->" + my_text2); // It prints My text 1(I want it prints "My text 2" too)

        string text_1 = "Example 1";
        object text_2 = text_1;

        text_1 = "Example 2";
        Console.WriteLine("First example --> " + text_1); // It prints Example 2
        Console.WriteLine("Second example -->" + text_2);// It prints Example 1
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 5

赋值是一种影响变量的操作。变量本身是独立的。值类型和引用类型的重要区别在于数据是存储在变量本身还是其他地方(并且变量只包含引用)。

因此,在分配给变量时,您更改了该变量1的内容。就其本身而言,这不会对任何其他变量产生明显影响。

您经常会注意到值类型和引用类型之间的差异是在对数据进行变异时。在这里,一个区别很明显,因为当你改变一个值类型的数据时,你是通过一个特定的变量来做的,你改变的是该变量的数据副本。而当你改变引用类型的数据时,你改变了数据,所有引用同一数据副本的变量都将看到变化。

但是,由于string没有任何(没有反射技巧或不安全代码)可变字段或变异方法,您将永远无法观察到这些string变量的变异。


1这里我指的是局部变量和字段。其他形式的赋值(例如属性)可以运行任意代码,因此当然它们可能具有其他可见的副作用。