列表在方法之外没有改变

时间:2016-08-04 10:24:13

标签: c#

我注意到有趣的动作,当我在某个方法中更改列表,并在此方法中抛出异常时,则不会更改方法列表的范围。

如何更改强制此列表在catch块中更改?用完了?

List<string> list = null;
try
{
    list = new List<string>{"1", "2", "3"};
    ChangeMyList(list);
}
catch
{
    //here list has 3 elements , why ? 
}

void ChangeMyList(List<string> list)
{
    list = list.Except(new List<string>{"1", "2"}).ToList();
    //here this list has only one element
    throw new Exception();
}

3 个答案:

答案 0 :(得分:5)

ChangeMyList内,list是外部作用域中list指向的源列表的引用的副本。分配给此本地引用不会影响调用方中的引用。您可以使用ref通过引用传递list

void ChangeMyList(ref List<string> list)
{
    list = list.Except(new List<string>("1", "2")).ToList();
    //here this list has only one element
    throw new Exception();
}

然后

List<string> list = new List<string>{"1", "2", "3"};
ChangeMyList(ref list);

答案 1 :(得分:2)

这不是因为例外;您的列表未被更改,因为在您调用该函数时会复制对它的引用,因为您的函数中的list是父作用域中list的副本,并且对其进行的任何更改都会赢得不能用原来的。

您有两种解决方案:

让函数返回list,并将其存储回原始变量:

try {
    having List<string> list = new List<string>{"1", "2", "3"};
    list = ChangeMyList(list);
} catch() {
}


List<string> ChangeMyList(List<string> list)
{
    list = list.Except(new List<string>("1", "2"));
    return list;
}

或者您只需使用ref关键字传递列表即可表明该功能会对其进行修改:

try {
    having List<string> list = new List<string>{"1", "2", "3"};
    ChangeMyList(ref list);
} catch() {
}


void ChangeMyList(ref List<string> list)
{
    list = list.Except(new List<string>("1", "2"));
}

答案 2 :(得分:1)

已经给出了答案,但仅限于那些像我一样以图形方式更好地理解它的人:

enter image description here