пожалуйста, объясните, как мы все еще можем вызвать "msEncrypt.ToArray ();"после окончания области действия самого внутреннего оператора using?
Поскольку документация обещает нам, что это так:
![This method works when the MemoryStream is closed](https://i.stack.imgur.com/BOFBE.png)
(Важно понимать, что в контексте объектов Stream
методы Close()
и Dispose()
фактически являются синонимами. )
В целом,важно помнить, что IDisposable.Dispose()
не имеет ничего общего с продолжительностью жизни объекта, реализующего этот интерфейс. Единственное, что он делает, это позволяет вашему коду информировать объект, когда он «сделан с его использованием», чтобы он мог очиститься (как правило, освобождая неуправляемые ресурсы… для любых управляемых объектов, в этом нет необходимости, поскольку сборщик мусора в CLR будетпозаботьтесь об этом).
Любая реализация объекта может делать все, что считает нужным, когда вызывается Dispose()
. Хотя типично, что объект стал бы непригодным для использования после вызова Dispose()
, это не требуется . И действительно, есть веские причины позволить по крайней мере некоторым методам в MemoryStream
, таким как ToArray()
, быть пригодными для использования даже после удаления объекта (но учтите, что даже для MemoryStream
большинство членов объекта являются непригодными после утилизации… ToArray()
- это особый случай).
В любом случае вызов Dispose()
never сделает недействительной саму ссылку на объект. Ссылка на объект всегда будет действительной, пока сам объект доступен. Сам объект должен решить, что должно произойти, если какой-либо другой код вызывает одного из его участников после его удаления. В большинстве случаев будет выброшено ObjectDisposedException
, но в некоторых конкретных случаях имеет смысл разрешить коду доступ к элементам, которые в первую очередь полезны, только когда код почти завершен с объектом и его основное назначение выполнено. MemoryStream.ToArray()
является таким членом.
Смотрите возможные повторяющиеся вопросы: Блок многократного использования, этот код безопасен? Вызов MemoryStream.GetBuffer () завершается успешно даже после MemoryStream.Close ();Почему? Почему вы все еще можете использовать удаленный объект? Разъяснение некоторых вещей об интерфейсе IDisposable. Экземпляр (должен быть) равен нулю после вызова Dispose?
Также смотрите тесно связанный вопрос: CA2202, как решить это дело