Когда я должен бросить `ObjectDisposedException`? - PullRequest
0 голосов
/ 24 апреля 2018

Джеффри Рихтер говорит ( в CLR через C # Edition 4, P.534 ), что все методы и свойства в классе, реализующем IDisposable, должны явно выдавать ObjectDisposedException.

Thisимеет смысл, но я никогда не видел, чтобы это было сделано в дикой природе.

Это рекомендация, которой просто не следуют, потому что разработчики не знают (или не заботятся), или это сложнее, чем это?

1 Ответ

0 голосов
/ 24 апреля 2018

Вы можете явно выбросить его, когда член вашего типа не может функционировать, поскольку ресурс, от которого он зависит, удаляется.

  • Во многих случаях ваш тип может заключать в себе экземпляр IDisposable.В этом случае вы можете просто вызвать членов обернутого экземпляра IDisposable и позволить ему быть ответственным за выброс ObjectDisposedException.

  • Но могут быть случаи, когда вы хотите выбросить его явно,Например, если ваш метод Dispose устанавливает для обернутого экземпляра IDisposable значение null, вам нужно явно выбросить выполнение, поскольку у вас больше нет экземпляра, которому его делегировать.

  • Или если вашКласс IDisposable напрямую владеет неуправляемым ресурсом, ему нужно будет явно генерировать ObjectDisposedException, если неуправляемый ресурс был освобожден.

  • Наконец, член, который выполняет значительную логику перед вызовом обернутого члена IDisposable, может захотеть«быстро потерпеть неудачу» и генерировать исключение ObjectDisposedException вместо ненужного выполнения такой логики.

  • Членам, которые не зависят от обернутого экземпляра IDisposable или неуправляемого ресурса, не нужно создавать исключение ObjectDisposedException, еслиболее уместно не делать этого.

  • Я не думаю, что совет Джеффри Рихтера о том, что все члены класса IDisposable должны бросать при утилизации, имеет смысл.Существует множество примеров в Framework классов IDisposable, в которых есть члены, которые не выбрасывают при удалении.Например,

    • FileStream.Name вернет имя, переданное конструктору FileStream, даже если FileStream удален, поскольку ему не нужно обращаться к потоку для возврата имени.

    • System.Windows.Form предоставит доступ многим членам после его удаления.Таким образом, если вы показали диалоговое окно модально и удалили форму, вы все равно можете получить доступ к пользовательскому вводу, который был введен в форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...