2010-06-25 40 views
17

我使用的是FtpWebResponse类,但没有看到Dispose方法。 It turns out这个类实现IDisposable,但这样明确,这样你必须先投你的实例IDisposable接口调用Dispose之前:为什么类会显式而不是隐式地实现IDisposable?

// response is an instance of FtpWebResposne 
((IDisposable) response).Dispose(); 

为什么会一类的,如这一个设计师选择要明确实现IDisposable?由于Anthony Pegram says这样做,掩盖了这样一个事实,即应该为普通开发人员处理该对象,而该开发人员在每次使用某个类时都未查阅文档。

回答

14
+0

我同意,但这里怪异的部分是行为可能不同。反射器显示Dispose()调用Close(),然后调用名为OnDispose()的内部虚拟。 Close()不会,所以你可能会从这两种方法中获得不同的行为(尽管它对FtpWebResponse没有影响,因为OnDispose()实现是空的) – JMarsch 2010-06-25 15:46:42

+1

两个具有相同名称的方法有什么问题? CLR通过C#(p。546)表示:“某些提供dispose模式的类也提供了一个方便的Close方法;但是dispose模式不需要这种方法。例如,System.IO.FileStream类提供了dispose模式,而这个类也是提供了一种Close方法,程序员发现关闭文件比处理文件更自然。“ – MCS 2010-06-25 15:49:08

+1

@JMarsch:这可能是一个延期; .NET 1.1 BCL类有很多情况,其中'Close'和'Dispose'确实有稍微不同的行为。 AFAIK,除了'DbConnection'和派生类型之外,这些都已经被清除了。 – 2010-06-25 15:54:26

1

这是一个有点怪异的在我身上。对于它的价值:基类(WebResponse)实现一个Close()方法。反射器显示WebResponse的Dispose()方法只调用Close()和一个不执行任何操作的Internal OnDispose虚拟。

我不得不承认它对我来说有点味道,但我敢打赌,他们明确实施了IDisposable,以便在调用Close()或Dispose()之间不会在Intellisense中造成混淆。

1

除了什么的已经说了,我可能会建议,实施IDisposable明确鼓励使用using块的,因为它可以在其上实现IDisposable任何类型的使用,它是更自然的(对大多数人来说,反正)写这样的:

using (var response = GetResponse()) 
{ 
    // do something 
} 

比这

var response = GetResponse(); 

// do something 

((IDisposable)response).Dispose(); 

我不知道这将是一个开发者的意图明确实施IDisposable,但它是可能的。

+3

它确实可以使用,但只有*如果你知道物体是一次性的!问题是,人们*不*咨询文件将不知道。并考虑可能具有较差文档的代码库(或者根本没有)。 – 2010-06-25 15:56:19

5
  • 偶尔一个类将有一个Dispose方法,它是接口的一部分,但实际上并不需要被调用,因为要处理的唯一资源是内存:例如,MemoryStream。
  • 正如其他人所说,如果类有一个与Dispose做同样事情的Close方法,可以说Dispose只需要存在来支持“using”模式,所以它也可以是明确的。
相关问题