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"
}