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

时间:2015-05-20 09:45:18

标签: c# garbage-collection idisposable

我正在开发C#应用程序时使用NDepend。我违反规则,声明“带有一次性实例字段的类型必须是一次性的”。

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

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

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

    // ...
}

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

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

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

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

    // ...
}

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

1 个答案:

答案 0 :(得分:3)

如果您不拥有"对象"你不能处置它。

有一些类(例如StreamReader)有一个配置选项来告诉他们是否应该取得你传递它们的Stream的所有权。显然StreamReader必须是IDisposable并进行逻辑检查

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

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

更相似的内容:PictureBox课程并未取得所通过的Image的所有权。 Image必须由控件的创建者/所有者处理和/或将Image替换为另一个Image,(将属性Image设置为)做了这个操作。

请注意,在C#中,无法知道控件是否应该拥有/拥有某些东西。您只能在文档中编写它。