На самом деле я не буду отвечать на ваши два вопроса, но выскажу мнение по поводу:
Заявленная причина в том, что это «запасной вариант», который вызывается в случае, если программист забывает вызвать Dispose()
.
Если требование состоит в том, чтобы вызывающий метод передавал, скажем, ненулевую строку, то вы вполне можете создать исключение, если они передают ноль, верно? Абонент нарушил договор; это исключительное поведение, поэтому вы бросаете исключение. Вы не думаете, о, звонящий «забыл» передать действительный аргумент, я думаю, что я приму плохой ввод и солдат. Это эффективно меняет контракт метода с «null неприемлемо и приведет к исключению» к «null допустимо и рассматривается как пустая строка», например.
Если требование состоит в том, что пользователь вызывает Dispose, когда он закончил, а он этого не сделал, то это ничем не отличается от вызывающего, не выполняющего контракт при вызове метода. Вызывающая сторона не выполнила требование, поэтому вылетает из программы . Пусть деструктор сгенерирует информативное исключение, если встретится с неразмещенным объектом. Так же, как вызывающие быстро узнают, что передача плохих аргументов в метод причиняет боль, они также узнают, что неспособность избавиться от вашего объекта тоже вредит.
Либо явное удаление объекта необходимо , либо это не так. Если это необходимо, убедитесь, что пользователь делает это. В противном случае скрывает свою ошибку .