Почему SimpleRpcServer RabbitMQ использует явную реализацию интерфейса для Dispose()?

Класс RabbitMQ.Client.MessagePatterns.SimpleRpcServer реализует IDisposable с использованием явной реализации интерфейса. Реализация:

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

Это означает, что для того, чтобы позвонить Dispose() на таком объекте я сначала должен привести его к IDisposable. Почему метод Dispose объявлен таким образом? Стоит ли вызывать Dispose() для объекта SimpleRpcServer? Я мог бы забыть это и просто позвонить Close()Я просто спрашиваю, потому что FxCop дал мне предупреждение об этом, и я не думаю, что я видел явные реализации интерфейса раньше.

3 ответа

Эта реализация присутствовала в некоторых классах.NET. Путаница связана с тем, нужно ли вам позвонить Close, Disposeили оба, когда действительно все они выполняют одно и то же действие.

Примером класса, который это реализовал, был RegistryKey, В .NET 3.5 и ранее он явно реализовал IDisposable интерфейс. Это побудило вас либо использовать его в использовании, либо позвонить Close метод.

В .NET 4.x и более поздних версияхIDisposable Интерфейс был неявно реализован.

я верю Stream был реализован аналогичным образом.

IDisposable пришло относительно поздно к.NET Framework 1.0, как видно из этого обсуждения в октябре 2000 года, и в частности следующего фрагмента:

Во-первых, мы обсуждаем формализацию шаблона проектирования, который мы уже используем в рамках. Все наши классы ресурсов уже поддерживают метод Dispose(). Это открытый метод, который вы можете вызвать в любое время, чтобы высвободить ресурсы, содержащиеся в объекте. Думайте об этом как оператор удаления C++, но на самом деле он не освобождает память, а просто запускает деструктор. Мы рассматриваем создание этого интерфейса, чтобы помочь кодифицировать шаблон проектирования и упростить некоторую языковую поддержку, как описано ниже.

Я считаю, что (*) именно поэтому многие классы.NET 1.0 предоставляют Close метод и только реализовать IDisposable в явном виде. И я думаю, что это было сочтено ошибкой, поэтому в более поздних версиях.NET чаще встречается IDisposable реализовано неявно. Например, общественный Dispose метод был добавлен к Stream класс в.NET 2.0.

(*) мое предположение, у меня нет никаких внутренних знаний.

Можно было бы поддерживать общий глагол, если структура предоставляется на нескольких языках, где Dispose может ничего не значить

Или это можно сделать, потому что Dispose может не иметь такого большого смысла, если есть также Open метод с Close это общий противостоящий глагол Open,

Например, 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(); }
}
Другие вопросы по тегам