如何销毁字典等C#数据<;字符串,列表<;行动<;对象>&燃气轮机>;?
我定义了一个像如何销毁字典等C#数据<;字符串,列表<;行动<;对象>&燃气轮机>;?,c#,dictionary,delegates,C#,Dictionary,Delegates,我定义了一个像Dictionary这样的对象来存储一些要调用的委托方法。如果我想毁掉这本字典。我需要先在字典中调用List.Clear()?或者只需调用字典。清除就可以了 这个: foreach(KeyValuePair<string, List<Action<object>>> kvp in dict) { kvp.Value.Clear(); } dict.Clear(); dict = null; 单凭这一点就行了。只有在全局级别声明字典引用时
Dictionary
这样的对象来存储一些要调用的委托方法。如果我想毁掉这本字典。我需要先在字典中调用List.Clear()
?或者只需调用字典。清除就可以了
这个:
foreach(KeyValuePair<string, List<Action<object>>> kvp in dict)
{
kvp.Value.Clear();
}
dict.Clear();
dict = null;
单凭这一点就行了。只有在全局级别声明字典引用时,才需要清除字典引用。不需要清除本地对象
dict = null;
只要对象的引用被清除,它就会在下一代GC上从内存中被清除。仅此即可。只有在全局级别声明字典引用时,才需要清除字典引用。不需要清除本地对象
dict = null;
只要对象的引用被清除,它将在该代的下一个GC上从内存中清除。如果您将要删除对dict
的最后一个实时引用,请不要对其进行任何处理:如果dict
仍在范围内,只需分配null
,或者,如果dict
的范围即将结束,则不要执行任何操作
不需要显式清除字典或它包含的任何列表,因为垃圾收集器会以任何方式处理它。显式清除字典及其包含的列表将浪费CPU周期。如果您将要删除对dict
的最后一个实时引用,请不要为任何引用烦恼:如果dict
的作用域仍在作用域中,只需将null
赋值,或者如果dict
的作用域即将结束,则不执行任何操作
不需要显式清除字典或它包含的任何列表,因为垃圾收集器会以任何方式处理它。显式清除字典及其包含的列表将浪费CPU周期。只要您没有对字典中存储的对象的引用或字典本身的引用,就可以将其设置为null
dict = null;
GC
将处理其余部分。只要您没有对字典中存储的对象或字典本身的引用,就可以将其设置为null
dict = null;
GC
将处理其余部分。第二个工作吗?如果是,则使用该选项,否则使用第一个选项代码>-没有别的了。甚至连dict.Clear()都没有代码>。您甚至不需要dict=null代码>如果变量超出范围。虽然如果您来自C语言背景,明确清除内容听起来很自然,但C#的垃圾收集系统会在不再需要资源时释放资源,让您花更多的时间对应用程序的核心部分进行编码。第二个可以吗?如果是,则使用该选项,否则使用第一个选项代码>-没有别的了。甚至连dict.Clear()都没有代码>。您甚至不需要dict=null代码>如果变量超出范围。虽然如果您来自C后台,明确清除内容听起来很自然,但C#的垃圾收集系统会在不再需要资源时释放资源,如果字典列表中存储的委托来自外部,则允许您花更多时间对应用程序的核心部分进行编码。调用清除方法是必要的?@JerryLee代理来自何处并不重要。如果您不打算重用字典或列表,请不要对其调用Clear()
。因此,您的意思是,即使字典包含一些委托,只要将其设置为null,GC也会收集它?对吗?@JerryLee是的,没错。只要没有其他实时引用您的字典,例如来自其他线程的引用,GC将收集字典、其内部结构、列表和列表的委托。谢谢,这解决了我很久以来的疑问!如果字典列表中存储的代理来自外部。调用清除方法是必要的?@JerryLee代理来自何处并不重要。如果您不打算重用字典或列表,请不要对其调用Clear()
。因此,您的意思是,即使字典包含一些委托,只要将其设置为null,GC也会收集它?对吗?@JerryLee是的,没错。只要没有其他实时引用您的字典,例如来自其他线程的引用,GC将收集字典、其内部结构、列表和列表的委托。谢谢,这解决了我很久以来的疑问!