最佳答案
在下面的代码中,
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace clone_test_01
{
public partial class MainForm : Form
{
public class Book
{
public string title = "";
public Book(string title)
{
this.title = title;
}
}
public MainForm()
{
InitializeComponent();
List<Book> books_1 = new List<Book>();
books_1.Add( new Book("One") );
books_1.Add( new Book("Two") );
books_1.Add( new Book("Three") );
books_1.Add( new Book("Four") );
List<Book> books_2 = new List<Book>(books_1);
books_2[0].title = "Five";
books_2[1].title = "Six";
textBox1.Text = books_1[0].title;
textBox2.Text = books_1[1].title;
}
}
}
我使用一个 Book
对象类型来创建一个 List<T>
,并用一些项填充它,给它们一个唯一的标题(从“1”到“5”)。
然后我创建 List<Book> books_2 = new List<Book>(books_1)
。
从这一点来看,我知道它是 list 对象的克隆,但是来自 book_2
的 book 对象仍然是来自 books_1
中的 book 对象的引用。通过对 books_2
的前两个元素进行修改,然后在 TextBox
中检查 book_1
的相同元素,证明了这一点。
books_1[0].title and books_2[1].title
确实已经改变为 books_2[0].title and books_2[1].title
的新值。
现在的问题是
我们如何创建一个新的 List<T>
硬拷贝?这个想法是,books_1
和 books_2
成为完全独立的对方。
我很失望微软没有提供一个整洁,快速和简单的解决方案,像 Ruby 正在做的 clone()
方法。
使用我的代码并用一个可行的解决方案修改它,这样它就可以被编译和工作了。我认为它将真正帮助新手试图理解提供的解决这个问题的办法。
编辑: 请注意,Book
类可以更复杂,具有更多的属性。