如何处理字典中的一次性资源
How to handle disposable resources within dictionary
我们有一些数据源 类 可以处理对一次性资源的操作,如下所示:
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
的 Clear
或 Remove
是否在内部处理 disposable
资源?
不,您应该自己处理一次性物品。字典不考虑这个。
就像 Micky 所说的,只有当它拥有对象的所有权时。
为什么字典中的元素在从字典中删除时应该自动处置?它可能存在于另一个列表中或无论如何。话虽如此,在某些集合中删除对象时处置对象是非常危险的。 None 您提到的方法(Remove
、Clear
,等等)对一次性对象有任何了解。所有这些方法所做的就是从内部缓存中删除对您的实例的 reference。然而,删除对对象的引用并不意味着它应该被释放 (GC) 或什至被处置 (IDisposable
)。这其实与一次性物品无关。例如,如果另一个列表中存在对它的另一个引用,即使 GC 也不会释放您的对象。
因此,您应该始终将资源放在您可以控制的位置 - 通常与您创建它们的位置相同。
我们有一些数据源 类 可以处理对一次性资源的操作,如下所示:
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
的 Clear
或 Remove
是否在内部处理 disposable
资源?
不,您应该自己处理一次性物品。字典不考虑这个。
就像 Micky 所说的,只有当它拥有对象的所有权时。
为什么字典中的元素在从字典中删除时应该自动处置?它可能存在于另一个列表中或无论如何。话虽如此,在某些集合中删除对象时处置对象是非常危险的。 None 您提到的方法(Remove
、Clear
,等等)对一次性对象有任何了解。所有这些方法所做的就是从内部缓存中删除对您的实例的 reference。然而,删除对对象的引用并不意味着它应该被释放 (GC) 或什至被处置 (IDisposable
)。这其实与一次性物品无关。例如,如果另一个列表中存在对它的另一个引用,即使 GC 也不会释放您的对象。
因此,您应该始终将资源放在您可以控制的位置 - 通常与您创建它们的位置相同。