在C#最佳实践中处理字典

在C#最佳实践中处理字典,c#,.net,dispose,C#,.net,Dispose,我的课堂上有一本ConcurrentDictionary。 键是表示管理器类的接口。 值是在此会话中用于该管理器的DataContracts类的列表 在处理会话类时,我希望清除此字典。我需要清除所有的值和键,但我不能处理键-因为它们在类dispose之后仍然存在 这够了吗这是否会导致GC执行该工作 _myDictionary = null; 或者我需要在所有键上使用foreach进行迭代,并使用Remove清除值 在处理会话类时,我希望清除此字典 为什么??如果会话实例将有资格进行垃圾收集,并

我的课堂上有一本ConcurrentDictionary。
键是表示管理器类的接口。
值是在此会话中用于该管理器的DataContracts类的列表

在处理会话类时,我希望清除此字典。我需要清除所有的值和键,但我不能处理键-因为它们在类dispose之后仍然存在

这够了吗这是否会导致GC执行该工作

_myDictionary = null;
或者我需要在所有键上使用foreach进行迭代,并使用Remove清除值

在处理会话类时,我希望清除此字典

为什么??如果会话实例将有资格进行垃圾收集,并且会话是引用字典的唯一对象,那么字典将有资格进行垃圾收集

这够了吗这是否会导致GC执行该工作

_myDictionary = null;
这几乎肯定是不必要的。如果其他任何内容引用了字典,则将该变量设置为
null
将无效。如果没有其他东西引用字典,会话将有资格进行垃圾收集,那么您根本不需要这样做

为了垃圾收集,唯一值得将变量设置为null的时间是该变量本身将继续存在的时间(例如,它是对象中不进行垃圾收集的实例变量,或者是静态变量)


请注意,顺便说一句,垃圾收集与对象的“处理”是完全独立的
Dispose
IDisposable
通常与非托管资源有关,您的问题中没有迹象表明该概念与此相关。

这就足够了。但是,如果字典以外的任何内容保留了对值的引用,那么在其他引用消失之前,这些值当然不会被释放。因为字典是托管资源,所以在处理会话类时,它将自动被GC释放?没有其他类持有对该字典的引用,但某个键/值集的键是对会话公开后将存在的类的引用,因此我确信这可能会干扰dispose。这个类实现了一个IDisPoable最佳实践pattern@ilansch:同样,垃圾处理和垃圾收集是分开的。如果没有其他内容引用会话实例,则可以对会话进行垃圾收集。键没有被垃圾收集这一事实并不能阻止字典被垃圾收集——关系不是从键到字典,而是相反。Ok。感谢您的回复,我的困惑是,因为我在这个会话中也作为私有成员持有回调委托,所以在释放会话时,这个委托必须设置为null。否则,从会话到长寿类的引用仍然存在。