C# 如何处理字典中的可支配资源

C# 如何处理字典中的可支配资源,c#,dictionary,idisposable,C#,Dictionary,Idisposable,我们有一些数据源类,它们处理对可支配资源的操作,如: public class SomeDataStore { private readonly object dictionaryLock = new object(); private readonly Dictionary<uint, SomeDisposableClass> dataStore = new Dictionary<uint, SomeDisposableClass>(); p

我们有一些数据源类,它们处理对可支配资源的操作,如:

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..
    }
}
公共类数据存储
{
私有只读对象字典lock=new object();
私有只读字典数据存储=新建字典();
公共布尔删除(uint键)
{
bool returnValue=false;
锁(锁)
{
returnValue=数据存储。删除(键);
}
//或者。。。
锁(锁)
{
某些可处置类元素;
if(dataStore.TryGetValue(key,out元素))
{
元素。Dispose();
returnValue=数据存储。删除(键);
}
}
返回值;
}
公共空间清除()
{
锁(锁)
{
dataStore.Clear();
}
//或者。。。
锁(锁)
{
foreach(dataStore.Values中的var值)
value.Dispose();
dataStore.Clear();
}
}
//其他一些数据存储访问成员
}
公共类SomeDisposableClass:IDisposable
{
公共空间处置()
{
//处置资源。。
}
}

不确定哪个版本更好,为什么?
字典
是否清除或
删除
内部处理一次性资源?

否,您应该自己保管一次性物品。这本词典没有考虑到这一点


正如Micky所说,只有当它拥有对象的所有权时才可以。为什么从字典中删除元素时,字典中的元素会被自动处理?它可能存在于另一个列表或其他任何地方。话虽如此,但在收集过程中移除物品时,处置物品是相当危险的。您提到的任何方法(
删除
清除
,等等)都不了解一次性物品。所有这些方法都是从内部缓存中删除对实例的引用。然而,删除对对象的引用并不意味着它应该被释放(GC)甚至被处置(
IDisposable
)。事实上,这与一次性物品无关。例如,如果在另一个列表中存在对对象的另一个引用,那么即使GC也不会释放您的对象


因此,您应该始终在您可以控制资源的地方处置资源,这通常与您创建资源的环境相同。

通常,在对象上调用
dispose
的代码是首先创建它的代码。对于
SomeDataStore
来说,假设它拥有对象的所有权有些危险。很难说,因为你的代码没有显示添加对象的迹象,更不用说创建对象的人了。删除(通过
Remove
Clear
或其他方式)不会调用dipose,你必须自己完成后完成。你可能想考虑使用<代码> CONTURNECTORION < /COD>而不是<代码>字典<代码> > <代码>锁定< /代码>。不过,它无法解决您当前的问题。如果它确实调用了
Dispose
,我希望该方法能够更清楚地说明它的意图,比如
removeanddose
。或者,让
Remove
返回
SomeDisposableClass
,以便调用方可以执行
SomeDataStore.Remove(key)?.Dispose()
,如果他们愿意的话。这取决于此类的使用方式。例如,如果我将我的对象放入字典,将其删除并通过这样做进行处理,我会非常惊讶。然而,在您的场景中,这可能正是预期的结果。