我们有一些数据源类来处理可支配资源的操作,如下所示:
public class SomeDataStore
{
private readonly object dictionaryLock = new object();
private readonly Dictionary<uint, SomeDisposableClass> dataStore = new Dictionary<uint, SomeDisposableClass>();
public bool Remove(uint key)
{
bool returnValue = false;
lock (dictionaryLock)
{
returnValue = dataStore.Remove(key);
}
//OR...
lock (dictionaryLock)
{
SomeDisposableClass element;
if (dataStore.TryGetValue(key, out element))
{
element.Dispose();
returnValue = dataStore.Remove(key);
}
}
return returnValue;
}
public void Clear()
{
lock (dictionaryLock)
{
dataStore.Clear();
}
//OR...
lock (dictionaryLock)
{
foreach (var value in dataStore.Values)
value.Dispose();
dataStore.Clear();
}
}
//Some other Datastore access members
}
public class SomeDisposableClass : IDisposable
{
public void Dispose()
{
//Dispose resources..
}
}
不确定哪个版本应该更好,为什么? Dictionary
&#39; s Clear
或Remove
内部处理disposable
资源吗?
答案 0 :(得分:1)
为什么字典中的元素在从中删除时会自动处理?它可能存在于另一个列表中或无论如何。说过在某些集合中删除对象时处理对象是非常危险的。您提到的方法(Remove
,Clear
,无论如何)都没有关于一次性物体的任何知识。所有这些方法都是从内部缓存中删除引用到您的实例。删除对象的引用但并不意味着它应该被释放(GC)或甚至被处置(IDisposable
)。这实际上与一次性物体无关。如果另一个列表中存在另一个对象的引用,即使GC也不会释放您的对象。
所以你应该总是把你的资源放在你控制它们的地方 - 这通常与你创建它们的环境相同。
答案 1 :(得分:0)
不,你应该照顾自己的一次性物品。字典没有处理这个问题。
像Micky所说,只有当它拥有对象的所有权时。