如何处理字典

时间:2017-11-29 07:55:21

标签: c# dictionary idisposable

我们有一些数据源类来处理可支配资源的操作,如下所示:

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 ClearRemove内部处理disposable资源吗?

2 个答案:

答案 0 :(得分:1)

为什么字典中的元素在从中删除时会自动处理?它可能存在于另一个列表中或无论如何。说过在某些集合中删除对象时处理对象是非常危险的。您提到的方法(RemoveClear,无论如何)都没有关于一次性物体的任何知识。所有这些方法都是从内部缓存中删除引用到您的实例。删除对象的引用但并不意味着它应该被释放(GC)或甚至被处置(IDisposable)。这实际上与一次性物体无关。如果另一个列表中存在另一个对象的引用,即使GC也不会释放您的对象。

所以你应该总是把你的资源放在你控制它们的地方 - 这通常与你创建它们的环境相同。

答案 1 :(得分:0)

不,你应该照顾自己的一次性物品。字典没有处理这个问题。

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