通过列表的深层副本实现真正的对象独立性
示例代码显示了两个包含 List<Book> books_1
对象的列表(List<Book> books_2
和 Book
)。 简单的赋值使 books_2
看起来是 books_1
的副本,但对 books_2
的更改也会影响 books_1
,因为它们共享对相同 Book
对象的引用。
深度克隆的重要性
要创建真正独立的副本,我们必须避免共享引用。 这需要创建全新的Book
对象并用原始数据填充它们——这个过程称为深度复制。
实现深度复制
可以使用带有 Select
或 ConvertAll
方法的 lambda 表达式高效地创建深拷贝:
使用Select
:
<code class="language-csharp">List<Book> books_2 = books_1.Select(book => new Book(book.title)).ToList();</code>
使用ConvertAll
:
<code class="language-csharp">List<Book> books_2 = books_1.ConvertAll(book => new Book(book.title));</code>
两种方法都会在 lambda 表达式中生成新的 Book
实例,从原始 title
对象复制 Book
属性。 生成的 books_2
列表包含全新的、独立的 Book
对象。
深度复制的优点
深度复制可确保对 books_2
的修改不会影响 books_1
。当您需要使用修改后的副本而不更改原始数据时,这一点至关重要。 这种方法保证了数据完整性并防止意外的副作用。
以上是如何创建列表的深层副本以实现真正的对象独立性?的详细内容。更多信息请关注PHP中文网其他相关文章!