将对象添加到集合(如 List)时到底发生了什么?
List<Person> people = new List<Person>();
Person dan = new Person() { Name="daniel", Age=10 };
people.Add(dan);
dan = new Person() { Name = "hw", Age = 44 };
当我执行上面的代码时,List<Person> people
不受最后一行的影响。
所以我假设列表复制添加对象的引用,所以当更改引用时,列表不会受到影响。我说得对吗?
最佳答案
好吧,您显示的代码实际上根本没有向列表中添加任何内容。我假设你打算拥有:
people.Add(dan);
在什么地方?
但是,是的,List<T>
包含对对象的引用。它不知道引用来自何处。有必要弄清楚变量及其值之间的区别。当你打电话时:
people.Add(dan);
在本例中复制参数表达式 ( dan
) 的值作为 List<T>.Add
中参数的初始值.该值只是一个引用 - 它与 dan
没有关联变量,而不是它恰好是 List<T>.Add
时变量的值被调用了。
和下面的情况完全一样:
Person p1 = new Person { Name = "Jon" };
p2 = p1;
p1 = new Person { Name = "Dan" };
在这里,p2
的值仍将是对名为“Jon”的人的引用——第二行只是复制了 p1
的值。至 p2
而不是将两个变量关联在一起。一旦理解了这一点,您就可以将相同的逻辑应用于方法参数。
关于C# List<T> 内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3147690/