2015-05-20 132 views
2

我正在开发C#应用程序时使用NDepend。我违反了一条规则,指出“带有一次性实例字段的类型必须是一次性的”。在这种情况下我应该真的实施IDisposable吗?

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

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吗?在所有情况下,处理程序类不应负责处理存储的控件(而是首先创建控件的类)。

+0

重要的问题是谁拥有一次性物品。它是否授予'SomeHandler'来拥有,或者仅仅是参考?如果第一个,那么是的,你应该实现IDisposable。如果后者,那么没有。 –

回答

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#中,无法知道控件是否应该拥有/拥有某件东西。你只能将它写在文档中。

+0

同意,“拥有X型领域”通常被误认为“拥有X型实例的所有权”。 – dcastro

+0

@xanatos感谢您的快速回复。我还应该实现IDisposable并将'_someControl'设置为'null'也许? –

+1

@TimMeyer这是一个很好的问题......我没有一个概念:-)一般来说,如果你的对象只是一个处理程序,那么你可能不应该......通过拥有一个“IDisposable”这个世界“我有一些我需要处理的东西”......但是你没有需要处理的东西:-) – xanatos

相关问题