我有一个类表示一些数据和一个集合类(从CollectionBase派生)。当我将集合类的一个实例分配给另一个实例时,它通过引用进行分配,所以我实现了ICloneable
接口。实现克隆方法
public void Add(object item)
{
InnerList.Add(item);
}
public object Clone()
{
MyCollection clone = new MyCollection();
foreach (MyClass item in this)
{
clone.Add(item);
}
return clone;
}
现在一切工作正常。但是,当我浏览元素并将它们逐个添加到克隆实例时,为什么不通过引用添加呢? Add
方法如何将它添加到InnerList中?为什么不通过参考添加?如果我添加一个这个集合的实例,让我们说一个List
并更改列表中的元素?原始实例是否会更改?
编辑:这是MyClass
。
public class MyClass
{
public bool IsEnabled { get; set; }
public string Parent { get; set; }
public string Child { get; set; }
public MyClass()
{
IsEnabled = false;
Parent = string.Empty;
Child = string.Empty;
}
public MyClass(bool isEnabled, string parent, string child)
{
IsEnabled = isEnabled;
Parent = parent;
Child = child;
}
public bool IsValid()
{
return (!Parent.Equals(string.Empty) &&
!Child.Equals(string.Empty));
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (!obj.GetType().IsAssignableFrom(this.GetType()))
{
return false;
}
return ((MyClass)obj).Parent.Equals(Parent) ||
((MyClass)obj).Child.Equals(Child);
}
public bool Equals(MyClass myClass)
{
if (myClass == null)
{
return false;
}
return myClass.Parent.Equals(Parent) ||
myClass.Child.Equals(Child);
}
public override int GetHashCode()
{
return Parent.GetHashCode();
}
}
编辑2:我所做的是
MyClass item = new MyClass(true, "test", "test");
MyCollection collection = new MyCollection();
collection.Add(item);
MyCollection newCollection = new MyCollection();
newCollection = (MyCollection) collection.Clone();
newCollection[0].Parent = "changed";
现在在这之后我预计该集合[0] .Parent将改为“改变”也,但它仍然保持不变。不是通过参考克隆实例添加的吗?
但是为什么集合的引用类型和我创建了自定义类是不? – hattenn
@hattenn - 应该是。你能分享“MyClass”的代码吗? –
我已添加到问题中。 – hattenn