2011-05-18 130 views
1

我一直在负责经历了一些旧的代码在工作中清理,我碰到一个偶然类:有关继承IDisposable的详细信息?

public class XMLLayer : Object, IDisposable 

首先,我发现明确的对象继承是不必要的,但后来我发现,处置方法是相当无用:

public void Dispose() 
{ 
    Dispose(); 
} 

无处处于using块的XMLLayer的实例中,具有它的Dispose()显式调用,或者被放置在IDisposable变量(多态性)。

我错在假设Dispose方法的思路是增加自己的自定义清理代码的类?

+0

你是说了'Dispose'方法调用本身? – Gabe 2011-05-18 18:30:00

+3

Woa,调用Dispose可能会导致堆栈溢出... – 2011-05-18 18:30:16

+4

我认为最初的开发人员认为'Dispose'意思是“处理过程”。你知道,如同它,把它发送到二进制地狱。 – BoltClock 2011-05-18 18:31:46

回答

2

要回答你的问题:

我错在假设Dispose方法的想法 是为您的课程添加您自己的自定义清理代码 ?

请参见以下问题及其接受的答案:

Proper use of the IDisposable interface

1

这种方法不仅是无用的 - 它会导致StackOverflowException和终止应用程序,如果它曾经被称为(或只是挂线程永远,如果JIT取得了使用尾递归)。

XMLLayer看起来真的有什么需要要配置吗?当C#是新的,有些人决定始终实施IDisposable“以防万一”。幸运的是,据我所知,这些日子并没有发生。

您应该实现IDisposable如果它是直接或间接持有的非托管资源 - 例如如果有一个类型为Stream的字段。

+0

不对我。有十几个字符串,另一个类(LayerInfo)具有相同的IDisposable问题(包括EXACT相同的循环递归处理函数)和一个列表。 – 2011-05-18 18:36:21

+0

@Corey:听起来像现在是删除Dispose方法和整个':Object,IDisposable' :)的时候 – 2011-05-18 18:39:01

0

不,你是对的。如果Dispose()法曾经被调用,它只是称自己永远反复无论如何,这是它从来没有被使用一个非常好的迹象。

1

这处置doen't似乎这么多无用的,因为它是危险的。它会自动调用自己,直到最终以杀死应用程序为止StackOverflowException

您正确地认为Dispose用于清理。但主要是清理非托管资源。这些都是资源是.NET甚至无法知道其存在,因此不会清除任何