C# 为什么向方法传递字符串的行为与List不同<;对象>;如果它们都是引用类型?

C# 为什么向方法传递字符串的行为与List不同<;对象>;如果它们都是引用类型?,c#,ref,out,reference-type,C#,Ref,Out,Reference Type,我在读一段代码,让我停在某行: List<object> props = new List<object>(); DoWork(param1, param2, props); //props.Count grew up 如果促使列表在其范围之外更改的行为是它的引用类型,那么为什么string如果没有在被调用方方法中重新分配,并且它是类似List?的引用类型,那么它不会更改?原因是string在C中是一个不可变的类型“更改”它实际上您正在使用新值创建一个新的字符串,并引用

我在读一段代码,让我停在某行:

List<object> props = new List<object>();
DoWork(param1, param2, props);
//props.Count grew up

如果促使列表在其范围之外更改的行为是它的引用类型,那么为什么
string
如果没有在被调用方方法中重新分配,并且它是类似
List

的引用类型,那么它不会更改?原因是
string
在C中是一个不可变的类型“更改”它实际上您正在使用新值创建一个新的
字符串
,并引用它

调用
ChangeMe
时,将创建对同一字符串的新引用。然后在方法中,您将新引用引用到一个全新的字符串,这不会影响在
Main
中定义的先前字符串

  • 有关字符串不可变的原因,请阅读:
  • 此外:

在函数
ChangeMe
中,您有一个对传入对象的引用的本地副本。当您在
str
中存储某个内容时,基本上用一个新的引用替换该引用。不变性在这里不起作用,因为您实际上没有尝试修改
str
引用的对象。因此,您现在在
str
中存储一个新引用,该引用指向在使用string literal
“W77”
时由string构造函数创建的新对象。正如您所指出的,您可以通过
ref
out
获得函数范围之外的引用

static void ChangeMe(string str)
{
    str = "W77";
}
public static void Main(string[] args)
{
    string str = "p1";
    ChangeMe(str);
    //str is still "p1"
}