Как я узнаю, когда мне нужно избавиться от объекта? - PullRequest
4 голосов
/ 08 марта 2009

КАК я знаю, когда мне нужно что-то распоряжаться? Кто-то только что упомянул, что в моем коде есть несколько объектов, которые мне нужно удалить. Я понятия не имел, что мне нужно что-то распоряжаться (это моя первая неделя с C #). Как я узнаю, когда мне нужно избавиться от объекта? я использовал http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspx, и я не вижу упоминания об утилизации на странице или видел упоминание об этом в каких-либо других объектах, которые мне было сказано (кем-то на SO)

Я знаю, что мне нужно, когда что-то наследует IDisposable, но КАК Я ЗНАЮ, когда это наследует?

Ответы [ 8 ]

4 голосов
/ 08 марта 2009

Вы должны утилизировать все, что реализует IDisposable. Просто оберните это с помощью:

   using(var some = new Something())
   {
    //use normally
   }
3 голосов
/ 09 марта 2009

Самый простой способ - набрать obj.disp и посмотреть, есть ли у intellisense метод dispose.

2 голосов
/ 08 марта 2009

Класс реализует интерфейс IDisposable, что означает, что он имеет метод Dispose.

Не каждый класс, реализующий IDisposable, требует, чтобы вы вызывали Dispose, но большинство из них делают. Если вы видите, что класс реализует IDisposable (или имеет метод Dispose, потому что он наследует интерфейс от базового класса), у вас есть два варианта:

  1. Углубитесь в документацию, чтобы узнать, почему класс реализует IDisposable, и действительно ли вам нужно вызвать Dispose.

  2. Просто позвоните Dispose.

Любой метод безопасен. Если метод Dispose ничего не делает, вызов будет очень быстрым. Вы даже можете позвонить Dispose более одного раза без вреда.

Еще лучше, чем просто вызвать метод Dispose, это использовать блок using:

using (FileStream s = File.OpenRead(path)) {
   ...
}

В конце скобки блока метод Dispose вызывается автоматически. Блок using реализован как try...finally, поэтому гарантированно вызывается метод Dispose, даже если в блоке возникает исключение.

0 голосов
/ 15 февраля 2011

«Будет ли последний человек покинуть комнату, пожалуйста, выключите свет?»

Объект, который реализует IDisposable, содержит информацию и импульс, необходимые для выполнения некоторых операций «очистки», которые должны произойти «когда-нибудь», но которые не могут произойти, пока объект все еще используется. Если объект полностью заброшен, эти операции очистки не произойдут. Система включает в себя хранителя, с помощью которого объекты могут регистрироваться при их создании; если объект покинут абсолютно все, кроме хранителя, хранитель может попросить объект выполнить свои действия по очистке, прежде чем хранитель тоже покинет его. Обратите внимание, что по разным причинам хранитель не на 100% эффективен в обращении с оставленными предметами. Поэтому очень желательно, чтобы, когда это возможно, последний объект, который содержал полезную ссылку на объект, избавился от него перед тем, как отказаться от ссылки.

0 голосов
/ 08 марта 2009

Я знаю, что мне нужно, когда что-то наследует IDisposable, но КАК я ЗНАЮ когда он наследует?

Предполагается, что вы используете Visual Studio. Я обычно щелкаю правой кнопкой мыши по типу, затем «Перейти к определению». Если я вижу, что он или любой из его суперклассов реализует IDisposable, я обязательно вызываю Dispose для него. Обычно это делается путем помещения его в блок using, как уже упоминали другие.

0 голосов
/ 08 марта 2009

Вы должны утилизировать любой объект, который реализует интерфейс IDisposable.

public abstract class HashAlgorithm : ICryptoTransform, 
IDisposable

Все, что имеет неуправляемые ресурсы (например, соединения с БД), должно реализовывать интерфейс IDisposable.

Для этого есть несколько веских причин:

  • Вы знаете, что неуправляемые ресурсы (которых, как правило, довольно мало) будут очищены. Обычно они в любом случае будут очищены в финализаторе, но из-за того, что GC должен привести в порядок объекты с финализаторами, это может занять некоторое время.
  • Если вы реализуете стандартный шаблон утилизации , вы сохраняете много работы GC, так как нет необходимости вызывать финализатор.
0 голосов
/ 08 марта 2009

Если класс реализует IDisposable, вы должны избавиться от экземпляров этого класса. Если это не так, то нет. В этом случае HashAlgorithm происходит от ICryptoTransform, который происходит от IDisposable. Это означает, что все экземпляры классов, происходящие из HashAlgorithm, должны быть удалены.

...