Там еще одна причина, по которой никто не упомянул (хотя это debateful, если это действительно стоит):
Соглашение говорит, что если кто-то использует класс, который реализует IDisposable
, он должен вызвать свой метод Dispose (либо явно, либо с помощью оператора 'using').
Но что произойдет, если V1 класса (в вашем публичном API) не нужно IDisposable, а V2 делает? Технически это не нарушает обратную совместимость, чтобы добавить интерфейс к классу, но из-за этого соглашение , это так! Потому что старые клиенты вашего кода не будут вызывать его метод Dispose и могут привести к тому, что ресурсы не будут освобождены.
(Почти) единственный способ избежать этого - внедрить IDisposable в любом случае, если вы подозреваете, что он понадобится вам в будущем, чтобы ваши клиенты всегда вызывали ваш метод Dispose, что когда-нибудь может действительно понадобиться.
Другой (и, вероятно, лучший) способ заключается в реализации лямбда-паттерна, упомянутого JaredPar выше в V2 API.