Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 要处置对象,是否应将所有属性设置为null?_C#_Dispose - Fatal编程技术网

C# 要处置对象,是否应将所有属性设置为null?

C# 要处置对象,是否应将所有属性设置为null?,c#,dispose,C#,Dispose,我目前正在尝试在我的一些对象上实现我的第一个dispose,我想知道检查每个反射的所有属性并将它们设置为null是否是一个坏主意?是的,这是一个坏主意 首先,一些属性可能是实现IDisposable接口的类,因此必须首先对它们调用Dispose方法 然后,如果您的一个属性是一个依赖COM组件或使用某些组件的类,则必须正确地处理它,否则将导致内存泄漏实现IDisposable并不意味着您必须将所有字段设置为null。当无法从根对象访问它们时,GC将处理这些问题 设置null将不起任何作用,直到GC

我目前正在尝试在我的一些对象上实现我的第一个dispose,我想知道检查每个反射的所有属性并将它们设置为null是否是一个坏主意?

是的,这是一个坏主意

首先,一些属性可能是实现
IDisposable
接口的类,因此必须首先对它们调用
Dispose
方法


然后,如果您的一个属性是一个依赖COM组件或使用某些组件的类,则必须正确地处理它,否则将导致内存泄漏

实现
IDisposable
并不意味着您必须将所有字段设置为
null
。当无法从根对象访问它们时,GC将处理这些问题

设置
null
将不起任何作用,直到GC注意到它没有管理任何引用,对象仍将在内存中

在我看来,没有比这更全面的答案了

仅当只剩下一个托管引用时,设置null才有帮助,尽管您不需要它,但您需要保持封装类型处于活动状态,然后将引用设置为
null
。否则,如果封装类型本身不可访问,则设置
null
没有任何意义