C# 列表未在方法之外更改

C# 列表未在方法之外更改,c#,C#,我注意到了一个有趣的动作,当我更改某个方法内的列表,并在该方法内抛出异常时,方法列表的范围外并没有更改 如何更改强制在catch块中更改此列表?用完了吗 List<string> list = null; try { list = new List<string>{"1", "2", "3"}; ChangeMyList(list); } catch { //here list has 3 elements , why ? } void Cha

我注意到了一个有趣的动作,当我更改某个方法内的列表,并在该方法内抛出异常时,方法列表的范围外并没有更改

如何更改强制在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();
}
List=null;
尝试
{
列表=新列表{“1”、“2”、“3”};
变更列表(列表);
}
抓住
{
//这里的列表有3个元素,为什么?
}
作废变更列表(列表)
{
list=list.Except(新列表{“1”,“2”}).ToList();
//这里这个列表只有一个元素
抛出新异常();
}

变更列表
中,
列表
是外部范围中
列表
指向的源列表引用的副本。分配给此本地引用不会影响调用方中的引用。您可以使用
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();
}
void ChangeMyList(参考列表)
{
列表=列表。除了(新列表(“1”、“2”))。ToList();
//这里这个列表只有一个元素
抛出新异常();
}
然后

List List=新列表{“1”、“2”、“3”};
变更列表(参考列表);

这不是因为异常;您的列表未被更改,因为在调用函数时对它的引用被复制,如中所示,函数中的
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;
}

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


列表对象在try块的内部范围内声明,因此它甚至不存在于块中。您的代码未编译。ChangeMyList方法中的代码是如何工作的:List(“1”,“2”)?我已经更新了你的代码以进行实际编译。哇,我想如果你像传递List一样传递引用,那么如果你修改了内部,那么外部也会发生变化,与传递int等值相反。。。那么它是如何工作的呢?列表不是被复制的,它是对被复制列表的引用-这是一个误导性的答案。哇,我想如果你像传递列表一样传递引用,那么如果你修改了内部,那么外部也会被改变,与你传递像int这样的值相反。。。那么它是如何工作的呢?@kosnkov-你通过使用
ref
out
来传递引用,而你在问题中没有这样做。默认情况下,参数按值传递,这对于引用类型意味着复制引用,因此对同一列表对象有两个引用。您可以通过两个引用来改变列表(例如,通过调用列表上的
Add
Remove
),但如果您希望分配在调用者中可见,则必须通过引用传递。
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;
}
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"));
}