【发布时间】:2014-11-25 10:12:54
【问题描述】:
我有一个枚举 Fruit 和一个类 FruitCollection,它派生出 Collection<Fruit>。我找不到使用.NET 克隆FruitCollection 的方法,我发现this MSDN article 定义了DeepClone() 函数并使用了MemberwiseClone()。现在,由于这是一个枚举,我认为我不需要“深度”克隆它,所以我认为MemberwiseClone() 就足够了。但是,当我在 PowerShell 中尝试时,克隆的对象似乎只是指向原始对象的指针,而不是克隆。我做错了什么?
还有其他方法可以简单地克隆 Collection 吗? FruitCollection 没有其他自定义成员。
C#代码:
public enum Fruit
{
Apple = 1,
Orange = 2
}
public class FruitCollection : Collection<Fruit>
{
public FruitCollection Clone()
{
return Clone(this);
}
public static FruitCollection Clone(FruitCollection fruitCollection)
{
return (FruitCollection)fruitCollection.MemberwiseClone();
}
}
PowerShell 输出:
PS> $basket1 = New-Object TestLibrary.FruitCollection
PS> $basket1.Add([TestLibrary.Fruit]::Apple)
PS> $basket2 = $basket1.Clone()
PS> $basket1.Add([TestLibrary.Fruit]::Orange)
PS> $basket2
Apple
Orange
【问题讨论】:
-
@TimSchmelter:你是说
Fruit是引用类型吗? -
@TimSchmelter 这是
object.MemberwiseClone()(即protected)。 -
object.MemberwiseClone()不会克隆集合的内容。它只是复制对象的字段——在这种情况下,其中一个字段将是一个数组(或其他引用集合类型),并且只复制引用。 -
谢谢,@MatthewWatson。那么,如何克隆
FruitCollection的内容?
标签: c# powershell collections clone