当WebResponse实现IDisposable接口时,为什么它没有公开可见的“Dispose”方法?

3
最近我在调试与 WebResponse 相关的代码时发现,我的问题在于在发出另一个 WebResponse 之前没有正确处理掉当前 WebResponse。我被误导了,因为要真正调用 dispose() 方法,需要将 WebResponse 强制转换为 IDisposable 接口(或者使用 "using" 等价方法)。
那么我的问题是:
1)微软公司是如何实现这一点的?
IDisposable 是一个公共接口,因此也是 public 的,但根据 MSDN 文档,WebResponse 更改了访问修饰符以变为 protected。我曾认为这是不可能的。
2)隐藏 dispose 方法的好处是什么?
为什么不允许 webResponse.Dispose() 直接有效呢?

你现在如何正确处理 WebResponse 的释放?根据文档,WebResponse不仅继承了 IDisposable,还实现了 Dispose() 方法。你只需要将你的 WebResponse 对象包装在一个 using 块中即可。 - Robert Harvey
我确实使用了 "using"(我在问题中提到了它)。只是好奇为什么会这样。 - Seth Micalizzi
@RobertHarvey现在点击“其他版本”下拉菜单;我猜测OP正在使用<= .NET 3.5。 - Marc Gravell
@SethMicalizzi 那个方法在4.0中是公共的。 - Marc Gravell
@MarcGravell 我是在错误的地方吗? http://imgur.com/C6EnntA (我的意思并不是讽刺,很难在互联网上传达这一点。 :-/) - Seth Micalizzi
显示剩余4条评论
1个回答

6

显式接口实现:

public class Foo : IDisposable {
    void IDisposable.Dispose() { /* code here */ }
}

可以使用任何接口方法完成这个操作。使用using API时会自动调用IDisposable 接口实现。
需要注意的是,不应该过度使用这个特性;例如下面的用法会令人困惑:
public class Foo : IDisposable {
    void IDisposable.Dispose() { /* do something */ }
    public void Dispose() { /* do something completely different */ }
}

1
@RobertHarvey 在 .NET 4.0 之前,是的。 - Marc Gravell
当我在WebResponse上执行“转到定义”时,这个应该仍然出现在文档中,不是吗? - Seth Micalizzi
@SethMicalizzi:如果它是“私有”的,就不行。 - Robert Harvey
我可能要求您窥探微软团队的想法,但在这种情况下为什么要使用显式接口实现?隐藏它的好处是什么? - Seth Micalizzi
1
@Seth 公平地说,不隐藏它的唯一好处是让人们意识到它的存在-你很少想自己调用它。然而,既然它现在是公开的,他们似乎同意你的观点:我不确定对其进行历史性的推测是否明智。 - Marc Gravell
@MarcGravell 说得对。 微软工程师很少轻率地做出这样的决定,因此我认为这可能是一个好的模型,我将来可以在其他情况下应用它。 但由于似乎是暂时性的问题,我们只能进行推测。 我会认为不隐藏它更符合接口的目的,而且真的看不出为什么你想改变访问修饰符,除非你在错误地使用接口。 - Seth Micalizzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接