班级RabbitMQ.Client.MessagePatterns.SimpleRpcServer使用explicit interface implementation实现IDisposable。实施是:
void IDisposable.Dispose()
{
Close();
}
这意味着为了在这样的对象上调用Dispose()
,我首先必须将其强制转换为IDisposable。为什么以这种方式声明Dispose方法?我是否应该在SimpleRpcServer对象上调用Dispose()?我可以忘记它并简单地调用Close()
,我只是问,因为FxCop给了我一个关于它的警告,我认为我之前没有看过显式的接口实现。
答案 0 :(得分:1)
此实现存在于某些.NET类中。混淆与您是否需要拨打Close
,Dispose
或两者相关时才会产生相同的操作。
实现它的类的一个例子是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
方法可能没有多大意义,因为Close
是Open
的常见反对动词。< / 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}}