克隆对象(尤其是ICloneable
接口)的问题在于公共接口不能很好地传达意图.
即 - 克隆的这种Clone
功能是否也List<T>
包含元素,或者只是克隆列表并复制对包含元素的引用?浅拷贝,复制引用并仅创建新列表将等效于:
List<T> clone = new List<T>(originalList);
Run Code Online (Sandbox Code Playgroud)
但是,如果你想强制克隆所有包含的元素,那么它将等同于:
List<T> clone = originalList.Select(x => (T)x.Clone()).ToList();
Run Code Online (Sandbox Code Playgroud)
这假设该类型T
正在实施ICloneable
.但是,即使使用此解决方案,也无法提前告知代码执行的确切影响.x
克隆自身元素意味着什么?它是一个浅层副本(由MemberwiseClone
它继承形式的方法提供System.Object
),还是一个深层副本.如果很深,如果列表中的两个对象引用相同的第三个对象会发生什么?第三个对象是复制两次还是只复制一次?等等......你可以看到它的发展方向.
由于上面列出的所有原因,克隆设施未包含在框架中.它由自定义代码决定克隆对象然后为其实现自定义代码的含义.