いくつかのデータを表すクラスと、そのためのコレクション クラス (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;
}
現在、すべてが正常に機能しています。しかし、要素を調べてクローン インスタンスに 1 つずつ追加すると、参照によって追加されないのはなぜですか? 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";
この後、 collection[0].Parent も「変更」に変更されると予想していましたが、それでも同じままです。クローンインスタンスを参照して追加されたのではありませんか?