Почему 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(); }
}