我注意到有趣的动作,当我在某个方法中更改列表,并在此方法中抛出异常时,则不会更改方法列表的范围。
如何更改强制此列表在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();
}
答案 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)