如果其他构造函数创建它,我应该处置通过构造函数传递的对象吗?

Should I Dispose Object Passed Through Constructor If Other Constructors Create It?

给定以下代码,我是否应该仅在 Bar class 中创建时才处理 foo?或者即使 foo 被传递给构造函数,我也应该始终处理它吗?我在想我应该添加另一个私有变量来跟踪 Bar 是否创建了 foo 或者它是否被传递给了 Bar( Foo foo ) 构造函数,并且只处理 foo当它由 public Bar( string name ) 构造函数创建时。

public class Bar: IDisposable
{
    private Foo foo = null;

    public Bar( string name )
    {
        this.foo = new Foo(name);
    }
    public Bar( Foo foo )
    {
        this.foo = foo;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    protected virtual void Dispose( bool disposing )
    {
        if( disposed )
            return;
        if( disposing )
            foo.Dispose();
        this.disposed = true;
    }
}

你的想法是对的。

如果您从其他地方传递了一个 Foo 的实例,并自行处理它,您可能会破坏仍在使用 Foo 的代码。如果您创建了 Foo 的实例但不处理它,您将挂在它消耗不必要的内存上。

因此,您最好的选择是跟踪您是否自己创建了实例,如果是,则将其处置。 (您也可以允许调用者指定行为,如评论中所述。)

(或者,你 可以 什么都不做,这样效率会更低,但至少不会破坏任何东西。唯一可能主动破坏某些东西的解决方案是,如果你处理从其他地方传入的实例。)