C# 字符串是按值传递还是按引用传递?[复制]

Is C# string passed by value or passed by reference? [duplicate]

提问人:Afaq 提问时间:12/6/2015 更新时间:12/6/2015 访问量:5803

问:

namespace Test
{
  class Program
  {
    static void Main(string[] args)
    {
      A a = new A();
      a.MyString = "Metallica ";
      PrintA(a);
      Console.WriteLine(a.MyString);

      string name = "Linkin ";
      Print(name);
      Console.WriteLine(name);

      Console.ReadLine();
    }

    static void PrintA(A a)
    {
      a.MyString = a.MyString + "Rocks";
      Console.WriteLine(a.MyString);
    }

    static void Print(string text)
    {
      text = text + "Park";
      Console.WriteLine(text);
    }
  }

  class A
  {
    public string MyString { get; set; }
  }

}

输出:

金属摇滚

金属摇滚

林肯公园

林肯

我的问题是,如果字符串是引用类型(即类),那么为什么在调用方法 Print() 后它不更改变量名称的值,就像引用变量 a 的成员 MyString 一样。

c# 可变 裁判

评论

2赞 Yacoub Massad 12/6/2015
“引用类型”并不意味着它将通过引用传递。

答:

0赞 yazan_ati 12/6/2015 #1

在 .NET 中,String 是一种引用类型。它通过引用传递。但是,当您对字符串值进行更改时,将创建另一个新副本,使原始副本保持不变。这就是为什么它的行为就好像它是按值发送的一样

评论

8赞 Soner Gönül 12/6/2015
不。按值传递与按引用传递以及按值类型与引用类型是完全不同的主题。它们没有关系。
6赞 Greg Beech 12/6/2015
这个答案是错误的。字符串是一种引用类型,但他的引用是通过值传递的。进行更改时也不会复制它,而是创建一个新字符串并将其分配给引用;由于引用是按值传递的,因此更改不会反映给调用方。