この問題を言葉で説明するのは難しいので、コードを次に示します。
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 番目のインスタンスが与えられます。では、 のいずれかのインスタンスを呼び出すにはどうすればよいのでしょうか。ItemListItemDispose()ItemList
Itemを破棄する責任を負わないようにすることを検討しましたが、それでものインスタンスの 1 つ_groupを呼び出すと、他の ItemList を構成するオブジェクトの一部を破棄することになります。Dispose()ItemListItem
内で何らかの参照カウントを行う必要があり、参照Itemが1つしか残っていない場合にのみ破棄する必要がありますか? これに関連して、オブジェクトがサブセットであることがわかっている場合は、ItemList呼び出す前にオブジェクトを空にしますか? Dispose()または、ItemSubsetList同じであるItemListが使い捨てではないクラスを作成しますか? ItemSubsetListが のスコープをエスケープした場合、ItemListどのようにクリーンアップしますか?
設計パターンやガイダンスはありますか?