我有一个代表一些数据的类和一个集合类(从 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 中?为什么不通过引用添加?如果我添加这个集合的一个实例,比如说 aList
并更改列表中的元素呢?原来的实例会被改变吗?
编辑:这里是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";
现在,在此之后,我预计 collection[0].Parent 也会更改为“已更改”,但它仍然保持不变。它不是通过引用克隆实例添加的吗?