C# - 处理递归对象

use*_*473 2 c# garbage-collection idisposable

假设我有一些对象C可以保存对自身实例的引用,也可以实现IDisposable.如何处理对其他实例的引用C?我应该递归调用他们的dispose方法还是我应该将它们设置为null?换句话说,首选哪种型号?

模型1:递归处置

public class C : IDisposable
{
    public List<C> subItems = new List<C>();

    public void Dispose() 
    {
        foreach (C subItem in subItems)
            subItem.Dispose();
        // Dispose other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

模型2:通过设置等于处理null

public class C : IDisposable
{
    public List<C> subItems = new List<C>();

    public void Dispose() 
    {
        subItems = null;

        // Dispose other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 8

我应该递归调用他们的处置方法

是.

但只有当C实际需要时IDisposable,这在您的代码中并不明显.它指的是同一个类的实例是不相关的,在所有拥有的IDisposable对象上调用Dispose().

如果这是尝试"帮助"垃圾收集器,那么停止它并且什么都不做.