2017-07-29 73 views
-2

我读,让我停在某行代码:为什么将字符串传递给方法的行为与列表<object>不同,如果它们都是引用类型?

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

我的想法是改变其范围以外的变量需要把它当作outref,但后来我意识到,除非DoWork方法的变化像props参考:

props = new List<object>();

参考将指向同一位置。所以这里不需要使用ref

,然后我创建了一个方法string类型:

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

如果激励名单的行为,它的范围之内可以改变的是它的引用类型,为什么string,如果它不是在重新配置不会改变被调用方法,它是一个参考类型,如List<object>

回答

1

原因是因为string不变类型在C#中,因此当你“变”它究竟是什么,你正在做的是创造一个新的string与新的价值和引用它。

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

1

在功能ChangeMe你有提到你传入的对象的本地副本。当你在str中存储了一些东西,你基本上用一个新的引用替换那个引用。不变性在这里不起作用,因为您实际上并未尝试修改由str引用的对象。因此,您现在有一个新的引用存储在str中,当您使用字符串文字"W77"时,它指向由字符串构造函数创建的新对象。正如您所指出的那样,您可以通过refout获得该功能的范围。

相关问题