この問題を言葉で説明するのは難しいので、コードを次に示します。
public class Item : IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private bool _disposed;
protected virtual void Dispose(bool disposing)
{
if (_disposed) return;
_disposed = true;
if (disposing)
{
//dispose managed resources
if (_group != null) _group.Dispose();
_stream.Close(); //or some legitimate thing that needs cleaned up
}
//dispose unmanaged resources
}
ItemList _group;
public ItemList Group { get{return _group;} set{_group = value;}}
public int SomeValue {get; set;}
}
public class ItemList : IList<Item>, IDisposable
{
public ItemList(IList<Item> list) : base(list)
{
list.ForEach(i => i.Group = this);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private bool _disposed;
protected virtual void Dispose(bool disposing)
{
if (_disposed) return;
_disposed = true;
if (disposing)
{
//dispose managed resources
this.ForEach(i => i.Dispose());
}
//dispose unmanaged resources
}
public ItemList CreateSubSet(int value)
{
return new ItemList(this.Where(i => i.SomeValue == value));
}
}
したがって、 で開始してItemList
を呼び出すと、元の ItemListと同じインスタンスのいくつかを含むItemList.CreateSubSet(2)
の 2 番目のインスタンスが与えられます。では、 のいずれかのインスタンスを呼び出すにはどうすればよいのでしょうか。ItemList
Item
Dispose()
ItemList
Item
を破棄する責任を負わないようにすることを検討しましたが、それでものインスタンスの 1 つ_group
を呼び出すと、他の ItemList を構成するオブジェクトの一部を破棄することになります。Dispose()
ItemList
Item
内で何らかの参照カウントを行う必要があり、参照Item
が1つしか残っていない場合にのみ破棄する必要がありますか? これに関連して、オブジェクトがサブセットであることがわかっている場合は、ItemList
呼び出す前にオブジェクトを空にしますか? Dispose()
または、ItemSubsetList
同じであるItemList
が使い捨てではないクラスを作成しますか? ItemSubsetList
が のスコープをエスケープした場合、ItemList
どのようにクリーンアップしますか?
設計パターンやガイダンスはありますか?