理解列表
提供的代码演示了将引用类型与列表一起使用时的常见陷阱。 Tag
类是引用类型,意味着变量保存对对象内存位置的 引用,而不是对象本身的副本。
在循环内,相同的_tag
实例被重复修改。列表中的每次添加都不会创建新的 Tag
对象;相反,它添加了对 same _tag
对象的另一个引用。 因此,最终列表包含多个指向 last 修改状态 _tag
.
为什么使用struct
可以解决问题
将 public class Tag
更改为 public struct Tag
可以解决该问题,因为结构是值类型。 当分配一个结构体时,会创建该结构体数据的副本。 因此,循环的每次迭代都会创建一个完全独立的 _tag
实例。对一个实例的修改不会影响其他实例,从而生成一个包含唯一 Tag
对象的列表。
派生集合类相关性
问题并不是 TagCollection
类的设计所固有的。 TagCollection
类本身似乎已正确实现。核心问题在于如何在填充列表的循环中处理 _tag
实例,特别是单个引用类型实例的重复修改。
以上是为什么使用引用类型时向列表添加新值会覆盖以前的值?的详细内容。更多信息请关注PHP中文网其他相关文章!