【问题标题】:c# strings are reference types - why when i change reference A's value, reference B doesn't change?c# 字符串是引用类型 - 为什么当我更改引用 A 的值时,引用 B 不会改变?
【发布时间】:2011-03-01 04:44:20
【问题描述】:

如果.NET中的字符串是引用类型,那么在下面的代码中,为什么string1更改后string2没有变为“hi”?

static void IsStringReallyAReference()
{
    string string1 = "hello";
    string string2 = string1;

    Console.WriteLine("-- Strings --");
    Console.WriteLine(string1);
    Console.WriteLine(string2);

    string1 = "hi";

    Console.WriteLine(string1);
    Console.WriteLine(string2);
    Console.Read();

}

/*Output:
hello
hello
hi
hello*/

【问题讨论】:

    标签: c# .net string reference-type


    【解决方案1】:

    这是因为 C# 字符串是不可变类型,这意味着您无法更改实例的值。

    当您更改字符串的值时,您实际上是在创建一个新字符串并将引用更改为指向新字符串,之后您的两个引用变量不再引用同一个字符串实例,一个引用原始字符串而另一个引用具有新值的新字符串实例。

    【讨论】:

    • 我这边+1。这里只是一个简单的问题。当我们通过引用将字符串传递给方法,然后在方法中更改字符串的值时,我们会在方法执行完成后获得字符串的更新值。这背后的基本原理是什么?
    • @samar,在这种情况下,您正在创建对引用的引用,因此当字符串更改(创建新字符串)时,初始引用会更新为引用新字符串。这种额外的间接级别给人以字符串已更改的外观,但实际上引用已更改为指向新字符串。希望这有点道理。
    【解决方案2】:

    这张图片可能有助于您理解这个概念。

    【讨论】:

      【解决方案3】:

      这是因为字符串在 .Net 中是不可变类型,即每次修改字符串时都会创建一个新字符串。

      来自 MSDN

      String 被称为不可变的,因为 一旦它的值不能被修改 已经被创造了。出现的方法 修改一个字符串实际上返回一个 包含的新字符串 修改。

      查看此链接的备注部分:http://msdn.microsoft.com/en-us/library/system.string(v=VS.80).aspx

      【讨论】:

      • 可变性与这个特定问题无关。
      【解决方案4】:

      当您将"hi" 分配给string1 时,发生的情况是变量string1 被分配了一个对包含文本"hi" 的堆上对象的新引用。

      然而,变量 string2 仍然持有包含文本的对象的引用 "hello" 其中。 p>

      【讨论】:

        猜你喜欢
        • 2019-01-09
        • 1970-01-01
        • 2020-07-21
        • 2014-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多