1

RabbitMQ.Client.MessagePatterns.SimpleRpcServer类使用显式接口实现来实现 IDisposable 。实现是:

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

这意味着为了调用Dispose()这样的对象,我首先必须将其强制转换为 IDisposable。为什么 Dispose 方法是这样声明的?我应该费心在 SimpleRpcServer 对象上调用 Dispose() 吗?我可以忘记它并简单地打电话Close(),我只是问,因为 FxCop 给了我一个警告,而且我认为我以前没有见过明确的接口实现。

4

3 回答 3

1

此实现存在于某些 .NET 类中。与您是否需要调用Close,Dispose或两者都调用有关的混淆,实际上它们都执行相同的操作。

一个实现它的类的例子是RegistryKey. 在.NET 3.5 及之前的版本中,它显式地实现了IDisposable接口。这鼓励您在 using 或调用Close方法中使用它。

.NET 4.x 及更高版本中,该IDisposable接口是隐式实现的。

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

于 2014-02-12T16:12:50.330 回答
1

IDisposable从 2000 年 10 月的讨论中可以看出,.NET Framework 1.0 的出现相对较晚,尤其是以下摘录:

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

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

(*) 我的假设,我没有任何内幕消息。

于 2014-02-12T16:30:41.440 回答
0

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

或者它可以这样做,因为Dispose如果还有一种Open方法可能没有多大意义,因为Close它是一个常见的对立动词Open

例如,ADODbConnection类都这样做:

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(); }
}
于 2014-02-12T16:40:11.183 回答