ИМХО, у класса есть только одна правильная причина для явной реализации IDisposable, которая могла бы быть, если бы ожидалось, что никто на самом деле не должен будет вызывать его. Тот факт, что класс реализует IDisposable в явном виде, может рассматриваться как показатель того, что можно безопасно создать объект этого конкретного класса , хотя не обязательно объект производного класса, и просто отказаться от него, когда он будет сделан с этим. Отсутствие непосредственно доступного метода Dispose для определенного класса можно было бы тогда рассматривать как индикатор того, что вызов Dispose для объекта, который, как известно, принадлежит к этому конкретному классу, не понадобится.
Обратите внимание, что наличие и использование ссылки на объект, который реализует IDisposable, без понимания того, что он делает, не является проблемой; приобретение владения таким объектом, однако, является. Фабричный метод, тип возвращаемого значения которого ничего не делает с IDisposable.Dispose и реализует его явным образом, но который иногда возвращает объект, ожидающий правильного удаления, может быть рецептом для утечек. Класс не должен явно реализовывать IDisposable, если он может использоваться в качестве типа возврата такого фабричного метода.
Лично я бы хотел избавиться от всех объектов, которые реализуют IDisposable, независимо от того, нужен он им или нет. Тем не менее, зная, что определенные конкретные типы IDisposable объекта могут быть очень полезны в тех случаях, когда обеспечение надлежащей утилизации было бы затруднительно или неудобно.