将列表传递给方法,在方法内修改列表,而不会影响“原始”

Jim*_*Jim 4 .net c# list

抱歉,如果该主题含糊不清,我会尽可能地总结一下,而不知道要达到的确切术语。

本质上我有一个列表,然后调用一个方法

public List<int> myList;

void Start () {
    myList = new List<int>();
    myList.Add (1);
    myList.Add (2);

    doSomething(myList);

    foreach (int i in myList){
        print (i);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的方法中,我想这样做(例如)

public void doSomething (List<int> myPassedList) 
{

    int A = 5;
    myPassList.Add (A);
    //... And then some other cool code with this modified list
}
Run Code Online (Sandbox Code Playgroud)

但是,我不想更改原始列表,我希望它保持原样。本质上,当我将列表传递给方法时,我想要列表的副本,然后在每次调用该方法时将其复制。

我想看到控制台打印“ 1”然后是“ 2”

但会显示“ 1”,“ 2”和“ 5”

希望这一切都有道理!非常感谢您的任何帮助

吉姆

Sir*_*ufo 6

如果您编写了一个处理列表但不会修改该列表的方法,那么您应该通过代码记录这一点

public void doSomething ( IEnumerable<int> myPassedValues ) 
{
    List<int> newList = myPassedValues.ToList();
    int A = 5;
    newList.Add(A);
    //... And then some other cool code with this modified list
}
Run Code Online (Sandbox Code Playgroud)

现在你和所有其他人都会知道,只需阅读此方法中不会修改传递的列表的声明

  • 因为你只保证你会收到一个 `IEnumerable&lt;int&gt;` 并且不能修改。您应该只使用完成工作所需的最少类型。它更安全,您可以处理从/支持该类型/接口的任何内容。 (2认同)

Dar*_*ren 5

List是引用类型,因此当您myPassedList作为参数传递给doSomething您时,您正在修改原始列表。

例如,您有两个选择,要么调用ToList()要么创建一个新列表:

public void doSomething (List<int> myPassedList) 
{
    List<int> newList = myPassedList.ToList();
    int A = 5;
    newList.Add(A);
    //... And then some other cool code with this modified list
}
Run Code Online (Sandbox Code Playgroud)

这样,原始列表myList将仅返回1和2。

  • 值得注意的是,对于引用类型,这个新列表将包含原始列表中的对象,因此将对两个列表的对象进行任何修改 (2认同)