Явная реализация IDisposable

Хотя есть много Q & по сравнению с IDisposable, которое можно найти на SO, я еще не нашел ответа на этот вопрос:

Я обычно следую практике, когда один из моих классов владеет объектом IDisposable, тогда он также реализует IDisposable и вызывает Dispose на принадлежащем объекте. Однако недавно я столкнулся с классом, который явно реализовал IDisposable, таким образом, не позволяя мне напрямую вызвать Dispose, заставляя меня бросать его, который я нашел раздражающим и ненужным.

Итак, вопрос: зачем и когда нужно использовать явную реализацию интерфейса IDisposable? Я знаю, что есть совершенно хорошая и действительная причина для реализации интерфейса явно, но в отношении IDisposable причина мне не совсем понятна.

+13
источник поделиться
3 ответа

Я бы сказал, что необычно иметь явную реализацию IDisposable.Dispose, если у вас нет альтернативного эквивалентного метода (например, Close).

В этом случае ваш класс-оболочка может вызвать Close, а не casting.

Примером может служить класс WebResponse в Framework <= V3.5. Интересно, что в .NET 4 существует общедоступный метод Dispose, поэтому, возможно, Microsoft решила, что явная реализация может быть не лучшей практикой.

Шон Фаркас, инженер-конструктор отдела безопасности CLR, пишет в журнале MSDN, что

Хотя используемый блок будет работать с классами, которые имеют явную реализацию IDisposable, я рекомендую, чтобы классы никогда не реализовывали интерфейс таким образом. Если вы явно реализуете IDisposable, разработчики, которые изучают вашу объектную модель с помощью IntelliSense® в Visual Studio®, не заметят, что у объекта есть метод Dispose

+14
источник

Я бы сказал, что это хорошая практика, он заставляет (если вы не хотите, чтобы выставлять на IDisposable!!) использование

using (ClassWithIDisposable) {
}

Dispose будет вызываться даже в случае исключения

Также при использовании структур IOC, таких как замок и единство, вам нужно наследовать IDisposable для вашего интерфейса, чтобы его можно было вызвать. Эти рамки позволяют AOP, при котором у вас нет ссылки на ваш твердый класс только на интерфейс......

+1
источник

IMHO, существует только одна правильная причина, по которой класс явно реализует IDisposable, что было бы, если бы оно ожидало, что на самом деле его не назовешь. Тот факт, что класс реализует IDisposable явно, можно рассматривать как индикатор того, что можно безопасно создать объект этого конкретного класса, хотя он и не обязательно является объектом производного класса, и просто отказаться от него, когда он был с этим. Отсутствие непосредственно доступного метода Dispose для определенного класса можно было бы рассматривать как индикатор, вызывающий Dispose для объекта, который, как известно, относится к этому конкретному классу, не понадобится.

Обратите внимание, что наличие и использование ссылки на объект, который реализует IDisposable, не осознавая, что это так, не является проблемой; однако приобретение собственности такого объекта. A factory, возвращающий тип которого ничего не делает с IDisposable. Явным образом его реализует и реализует, но иногда возвращает объект, который ожидает надлежащего удаления, будет рецептом утечек. Класс не должен явно реализовывать IDisposable, если он может использоваться как возвращаемый тип такого метода factory.

Лично мне хотелось бы удалить все объекты, которые реализуют IDisposable, независимо от того, нужна она им или нет. Тем не менее, зная, что некоторые определенные типы IDisposable объекта могут быть очень полезными в тех случаях, когда обеспечение надлежащего удаления в противном случае было бы трудным или неудобным.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос