Для чего нужен IDisposable?

c# garbage-collection dispose idisposable

8068 просмотра

6 ответа

129 Репутация автора

Если в .NET есть сборка мусора, тогда зачем вам явно вызывать IDisposable?

Автор: FendFend Источник Размещён: 05.03.2009 02:53

Ответы (6)


48 плюса

1140686 Репутация автора

Решение

Сборка мусора для памяти. Вам необходимо избавиться от ресурсов, не связанных с памятью - файловых дескрипторов, сокетов, дескрипторов GDI +, соединений с базой данных и т. Д. Это типично то, что лежит в основе IDisposableтипа, хотя фактический дескриптор может быть довольно длинным в цепочке ссылок. Например, вы можете получить Disposeобъект, на XmlWriterкоторый StreamWriterесть ссылка, на который FileStream он ссылается, который освобождает дескриптор файла.

Автор: Jon Skeet Размещён: 05.03.2009 02:56

5 плюса

88444 Репутация автора

Потому что объекты иногда хранят ресурсы рядом с памятью. GC освобождает память; IDisposable, так что вы можете выпустить что-нибудь еще.

Автор: James Curran Размещён: 05.03.2009 02:56

1 плюс

46619 Репутация автора

потому что вы хотите контролировать, когда ресурсы, удерживаемые вашим объектом, будут очищены.

Видите, GC работает, но он делает это, когда ему это нравится, и даже тогда финализаторы, которые вы добавляете к своим объектам, будут вызываться только после 2 сборок GC. Иногда вы хотите убрать эти объекты немедленно.

Это когда IDisposable используется. Вызывая Dispose () явным образом (или используя синтаксический сахар блока using), вы можете получить доступ к своему объекту, чтобы очистить себя стандартным способом (то есть вы могли бы реализовать свой собственный вызов cleanup () и вызывать его явно вместо этого)

Примеры ресурсов, которые вы бы хотели немедленно очистить: дескрипторы базы данных, дескрипторы файлов, сетевые дескрипторы.

Автор: gbjbaanb Размещён: 05.03.2009 02:58

8 плюса

1445 Репутация автора

Немного расширив другие комментарии:

Метод Dispose () должен вызываться для всех объектов, имеющих ссылки на неуправляемые ресурсы. Примерами таких могут быть файловые потоки, соединения с базой данных и т. Д. Основное правило, которое работает большую часть времени: «если объект .NET реализует IDisposable, то вам следует вызывать Dispose (), когда вы закончите работу с объектом.

Тем не менее, некоторые другие вещи, которые следует иметь в виду:

  • Вызов dispose не дает вам контроля над тем, когда объект действительно уничтожен и память освобождена. GC справляется с этим для нас и делает это лучше, чем мы можем.
  • Утилита очищает все нативные ресурсы, вплоть до стека базовых классов, как указал Джон. Затем он вызывает SuppressFinalize (), чтобы указать, что объект готов к восстановлению и дальнейшая работа не требуется. Следующий прогон GC очистит его.
  • Если Dispose не вызывается, то GC находит объект как нуждающийся в очистке, но сначала необходимо вызвать Finalize, чтобы убедиться, что ресурсы освобождены, этот запрос на Finalize ставится в очередь, и GC перемещается, поэтому отсутствие вызов Dispose заставляет запустить еще один GC, прежде чем объект может быть очищен. Это заставляет объект быть продвинутым к следующему «поколению» GC. Может показаться, что это не так уж и сложно, но в приложении с нагрузкой на память продвижение объектов до GC более высокого поколения может привести к тому, что приложение с большой памятью перестанет быть приложением с нехваткой памяти.
  • Не реализуйте IDisposable в ваших собственных объектах, если вам это абсолютно не нужно. Плохо реализованные или ненужные реализации могут на самом деле сделать вещи хуже, а не лучше. Некоторое хорошее руководство можно найти здесь:

    Реализация метода утилизации

    Или прочитайте весь раздел MSDN по сборке мусора

Автор: TheZenker Размещён: 05.03.2009 03:36

1 плюс

832 Репутация автора

Чтобы использовать ключевое слово using, объект должен реализовывать IDisposable. http://msdn.microsoft.com/en-us/library/yh598w02(VS.71).aspx

Автор: Kyle LeNeau Размещён: 05.03.2009 08:17

0 плюса

60812 Репутация автора

IDisposableИнтерфейс часто описывается с точки зрения ресурсов, но большинство таких описаний не на самом деле считают , что «ресурс» на самом деле означает.

Некоторые объекты должны просить внешние объекты сделать что-то от их имени, в ущерб другим объектам, до дальнейшего уведомления. Например, объекту, охватывающему файловый поток, может потребоваться попросить файловую систему (которая может находиться в любом месте подключенного юниверса) предоставить эксклюзивный доступ к файлу. Во многих случаях потребность объекта во внешнем объекте будет связана с потребностью внешнего кода в объекте. Например, после того, как клиентский код сделает все, что он собирается сделать с вышеупомянутым объектом файлового потока, этому объекту больше не нужно будет иметь эксклюзивный доступ (или какой-либо доступ в этом отношении) к своему связанному файлу.

В общем, объект X, который просит объект сделать что-то, пока дальнейшее уведомление не влечет за собой обязательство доставить такое уведомление, но не может доставить такое уведомление, пока клиенту X могут понадобиться услуги X. Цель IDisposableсостоит в том, чтобы предоставить единообразный способ информирования объектов о том, что их услуги больше не требуются, чтобы они могли уведомлять объекты (если таковые имеются), которые действовали от их имени, о том, что их услуги больше не требуются. Код, который вызывает, не IDisposableдолжен ни знать, ни заботиться о том, какие (если таковые имеются) услуги запрашивал объект у внешних объектов, поскольку он IDisposableпросто приглашает объект выполнить обязательства (если таковые имеются) перед внешними объектами.

Чтобы поместить вещи в «ресурсы», объект получает ресурс, когда он просит внешнюю сущность сделать что-то от его имени (как правило, хотя и не обязательно, предоставляя исключительное использование чего-либо) до дальнейшего уведомления, и освобождает ресурс, когда он говорит, что внешнему субъекту его услуги больше не требуются. Код, который получает ресурс, не получает «вещь» в той степени, в которой он берет на себя обязательство; Освобождение ресурса не оставляет «вещь», но выполняет обязательство.

Автор: supercat Размещён: 26.06.2017 03:09
Вопросы из категории :
32x32