很难用语言来描述这个问题,所以这里是代码:
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.CreateSubSet(2)
,您将获得第二个实例,ItemList
其中包含Item
原始 ItemList 中的一些相同实例。那么你怎么去调用Dispose()
任何一个实例ItemList
,因为一旦你这样做了,你实际上会处理它们两个?
我考虑过让makeItem
不负责处置_group
,但即便如此,如果您调用Dispose()
的一个实例ItemList
,您最终还是会处置Item
构成另一个 ItemList 的一些对象。
您是否必须在 内进行某种引用计数Item
,并且仅在仅剩 1 个引用时才处理它?与此结合,如果您知道它是一个子集,也许ItemList
在调用之前清空对象?Dispose()
或者也许可以创建一个ItemSubsetList
相同ItemList
但不是一次性的课程?如果ItemSubsetList
逃脱了 的范围ItemList
,那么你将如何清理它?
任何设计模式或指导?