如何处理字典中的一次性资源

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..
    }
}

不确定哪个版本应该更好,为什么? DictionaryClearRemove 是否在内部处理 disposable 资源?

不,您应该自己处理一次性物品。字典不考虑这个。

就像 Micky 所说的,只有当它拥有对象的所有权时。

为什么字典中的元素在从字典中删除时应该自动处置?它可能存在于另一个列表中或无论如何。话虽如此,在某些集合中删除对象时处置对象是非常危险的。 None 您提到的方法(RemoveClear,等等)对一次性对象有任何了解。所有这些方法所做的就是从内部缓存中删除对您的实例的 reference。然而,删除对对象的引用并不意味着它应该被释放 (GC) 或什至被处置 (IDisposable)。这其实与一次性物品无关。例如,如果另一个列表中存在对它的另一个引用,即使 GC 也不会释放您的对象。

因此,您应该始终将资源放在您可以控制的位置 - 通常与您创建它们的位置相同。