C# List<T> 内部

标签 c# generics list

将对象添加到集合(如 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/

相关文章:

Swift 泛型不保留类型

c# - 为什么类型推断不能根据约束确定类型

c# - 使用 linq 迭代字段

c# - 可以使用 ConcurrentDictionary 进行一对多映射吗?

c# - 要求在 C# 中存在静态方法

java - List.of() — 为什么要提供无法添加/删除/编辑的空元素列表?

python - 按位置对字符串列表进行排序

Python,如何打印列表中列表中的特定项目?

c# - 用数据库中的数据填充组合框

javascript - “system.Action”不是有效的 Windows 运行时参数类型