В отличие от большинства интерфейсных методов, IDisposable.Dispose
ничего не обещает. Вместо этого он предоставляет стандартные средства, с помощью которых владелец объекта может сообщить этому объекту, что его службы больше не требуются, на случай, если объекту может понадобиться использовать эту информацию. Если объект попросил внешние объекты сделать что-то от его имени и пообещал этим внешним объектам, что сообщит им, когда их услуги больше не понадобятся, его Dispose
метод может передать уведомление этим объектам.
Если у объекта есть метод, который может быть выполнен только тогда, когда у объекта есть внешние сущности, действующие от его имени, попытка вызвать этот метод после того, как эти сущности были отклонены, должна вызывать ObjectDisposedException
а не сбой каким-либо другим образом эм>. Кроме того, если есть метод, который не может быть полезен после закрытия объекта, он часто должен выдавать ObjectDisposedException
, даже если конкретному объекту на самом деле не нужно использовать объект. С другой стороны, если конкретный вызов будет иметь разумное значение после того, как объект отклонил все сущности, которые действовали от его имени, нет особых причин, по которым такой вызов не должен быть допущен к успеху.
Я бы просматривал ObjectDisposedException
так же, как я просматриваю InvalidOperationException
с измененной коллекцией из IEnumerator<T>.MoveNext()
: если какое-то условие (либо Dispose
, либо модификация коллекции, соответственно) не позволяет методу вести себя «нормально», методу разрешено выбрасывать указанное исключение, и ему не разрешается вести себя каким-либо другим ошибочным образом. С другой стороны, если метод способен без труда достичь своих целей и если это имеет смысл, такое поведение следует считать столь же приемлемым, как и генерирование исключения. Как правило, объекты не обязаны работать в таких неблагоприятных условиях, но иногда это может быть полезно для них [например, перечисление ConcurrentDictionary
не будет аннулировано изменениями в коллекции, поскольку такое аннулирование сделало бы параллельное перечисление бесполезным].
person
supercat
schedule
30.05.2014
GetBuffer
даст вам весь буфер, включая все отступы, которые есть для роста. Если поток не был инициализирован с фиксированной емкостью, это, вероятно, означает, что у вас есть нули в конце, которые вам не нужны. Тем не менее,GetBuffer
работает только тогда, когда размер буфера фиксирован, если я правильно читаю код. - person Luaan   schedule 26.05.2014