在这种情况下我真的应该实施 IDisposable 吗?

Should I really implement IDisposable in this case?

我目前在开发 C# 应用程序时使用 NDepend。我违反了一条规定 "Types with disposable instance fields must be disposable".

我知道当你做这样的事情时,你实际上应该这样做:

class SomeClass : IDisposable
{
    private Control _someControl; // implements IDisposable

    public SomeClass()
    {
        _someControl = new RandomControl();
    }

    // ...
}

但是,我在处理程序 class 中遇到了这样的违规行为:

public class SomeHandler
{
    private Control _someControl; // implements IDisposable

    public SomeHandler(Control control)
    {
        _someControl = control;
    }

    public void SomeMethod()
    {
        DoSomethingWith(_someControl);
    }

    // ...
}

处理程序对象应该与控件一样长。在这种情况下我真的应该实施 IDisposable 吗?在所有情况下,处理程序 class 不应该负责处理存储的控件(而是首先创建控件的 class)。

如果您没有 "object" 的所有权,则不得处置它。

有一些 classes(例如 StreamReader)有一个配置选项来告诉他们是否应该获得您传递给他们的 Stream 的所有权。显然 StreamReader 必须是 IDisposable 并做一些逻辑检查

例如:https://msdn.microsoft.com/library/gg712952.aspx

public StreamReader(
    Stream stream,
    Encoding encoding,
    bool detectEncodingFromByteOrderMarks,
    int bufferSize,
    bool leaveOpen
)

更相似的是:PictureBox class 没有取得 Image 传递的所有权。如果将 Image 替换为另一个 Image,则 Image 必须由控件 and/or 的 creator/owner 处理(设置 属性 Image) 由执行操作的人执行。

请注意,在 C# 中,无法知道控件是否应该 take/has 某物的所有权。只能写在文档里。