Из всего, что я читал об одноразовых расходных материалах, я бы сказал, что они действительно были изобретены главным образом для решения одной проблемы: своевременного освобождения неуправляемых системных ресурсов. Но все же все примеры , которые я обнаружил, не только сосредоточены на теме неуправляемых ресурсов, но также имеют другое общее свойство:
Dispose вызывается только для ускорения процесса, который в противном случае произошел бы позже автоматически (GC -> финализатор -> dispose)
Вызов метода dispose, который отменяет подписку на событие, однако никогда не произойдет автоматически, даже если вы добавите финализатор, который будет вызывать ваше удаление. (по крайней мере, до тех пор, пока существует объект, владеющий событием, и если он будет вызван, вы не выиграете от отказа от подписки, поскольку объект, владеющий событием, также в любом случае исчезнет)
Таким образом, основное отличие состоит в том, что события каким-то образом создают граф объектов, который не может быть собран, поскольку объект обработки событий внезапно становится ссылкой на сервис, на который вы просто хотели сослаться / использовать. Вы внезапно вынуждены вызвать Dispose - автоматическое удаление невозможно . Таким образом, Dispose получит тонкое иное значение, чем то, которое можно найти во всех примерах, когда вызов Dispose - в грязной теории;) - не нужен, поскольку он будет вызываться автоматически (в некоторый момент времени) ...
Во всяком случае.
Поскольку одноразовый шаблон уже довольно сложен (он имеет дело с финализаторами, которые трудно понять правильно, и со многими руководящими принципами / контрактами) и, что более важно, в большинстве пунктов не имеет ничего общего с темой обратной ссылки на событие, я бы сказал, что это будет проще получить это разделение в наших головах, просто не используя эту метафору для чего-то, что можно было бы назвать «unroot from object graph» / «stop» / «off off».
Чего мы хотим добиться, так это отключить / остановить некоторое поведение (отписавшись от события).
Было бы неплохо иметь стандартный интерфейс, такой как IStoppable, с методом Stop (), который по контракту просто фокусируется на
- отключение объекта (+ всех его собственных остановок) от событий любых объектов, которые он не создал своими собственными
- чтобы он больше не вызывался в неявном стиле события (поэтому может восприниматься как остановленный)
- можно собирать, как только исчезнут все традиционные ссылки на этот объект
Давайте назовем единственный интерфейсный метод, который отменяет подписку «Stop ()». Вы бы знали, что остановленный объект находится в приемлемом состоянии, но только остановлен. Возможно, было бы неплохо иметь простое свойство "Остановлено".
Было бы даже целесообразно иметь интерфейс «IRestartable», который наследуется от IStoppable и дополнительно имеет метод «Restart ()», если вы просто хотите приостановить определенное поведение, которое, безусловно, понадобится снова в будущем, или сохранить удаленный объект модели в истории для последующего восстановления отмены.
После всего написанного я должен признаться, что только что видел пример IDisposable где-то здесь: http://msdn.microsoft.com/en-us/library/dd783449%28v=VS.100%29.aspx
Но в любом случае, пока я не получу каждую деталь и оригинальную мотивацию IObservable, я бы сказал, что это не лучший пример использования
- опять же, это довольно сложная система, и у нас здесь только небольшая проблема
- и, возможно, одна из причин всей этой новой системы состоит в том, чтобы вообще избавиться от событий, что может привести к некоторому переполнению стека относительно исходного вопроса
Но, похоже, они на правильном пути. В любом случае: они должны были использовать мой интерфейс "IStoppable";), так как я твердо верю, что есть разница в
- Утилизировать: «Вы должны вызвать этот метод или что-то еще может утечка , если GC опаздывает» ....
и
- Стоп: «Вы должны вызвать этот метод для остановить определенное поведение »