为什么RabbitMQ的SimpleRpcServer使用Dispose()的显式接口实现?

时间:2014-02-12 15:55:41

标签: c# rabbitmq idisposable explicit-interface

班级RabbitMQ.Client.MessagePatterns.SimpleRpcServer使用explicit interface implementation实现IDisposable。实施是:

void IDisposable.Dispose()
{
    Close();
}

这意味着为了在这样的对象上调用Dispose(),我首先必须将其强制转换为IDisposable。为什么以这种方式声明Dispose方法?我是否应该在SimpleRpcServer对象上调用Dispose()?我可以忘记它并简单地调用Close(),我只是问,因为FxCop给了我一个关于它的警告,我认为我之前没有看过显式的接口实现。

3 个答案:

答案 0 :(得分:1)

此实现存在于某些.NET类中。混淆与您是否需要拨打CloseDispose或两者相关时才会产生相同的操作。

实现它的类的一个例子是RegistryKey。在.NET 3.5 and before中,它明确实现了IDisposable接口。这鼓励您在使用中使用它或调用Close方法。

.NET 4.x and beyond中,隐式实现了IDisposable接口。

我相信Stream以类似方式实施。

答案 1 :(得分:1)

IDisposable来自.NET Framework 1.0的时间相对较晚,可以从this discusson from October 2000看到,特别是以下摘录:

  

首先,我们正在讨论正式化我们已经使用的设计模式   在框架内。我们所有的资源类都支持一种方法   叫Dispose()。这是一种可以随时调用的公共方法   将释放该对象包含的资源。想想它   像c ++删除操作符,但它实际上没有释放内存,它   只运行析构函数。我们正在考虑将其作为一个接口   帮助编纂设计模式并促进一些语言支持   如下所述。

我相信(*)这就是许多.NET 1.0类公开Close方法并且只显式实现IDisposable的原因。我认为这被认为是一个错误,这就是为什么在.NET的更高版本中,更常见的是隐式实现IDisposable。例如,公共Dispose方法已添加到.NET 2.0中的Stream类。

(*)我的假设,我没有任何内部知识。

答案 2 :(得分:0)

如果框架是以Dispose可能没有任何意义的多种语言提供的话,可能是维护一个共同的动词

或者可以这样做,因为Dispose如果还有Open方法可能没有多大意义,因为CloseOpen的常见反对动词。< / p>

例如,ADO DbConnection类都执行此操作:

connection.Open();
conncetion.Close();

另外,可能是IDisposable在产品已经发布并且具有现有Close方法后实施并且保持向后兼容Dispose被显式实现隐藏Close // version 1 public class Thing { public void Close() { ... } } // version 2 public class Thing : IDisposable { public void Close() { ... } void IDisposable.Dispose() { Close(); } } 1}}然后调用:

e.g。

{{1}}