Какова цель использования?

DUPE: Использование использования в C #

Я видел, как люди использовали следующее, и мне интересно, какова его цель? Неужели объект уничтожается после использования сборщиком мусора?

Пример:

using (Something mySomething = new Something()) {
  mySomething.someProp = "Hey";
}

person Community    schedule 18.02.2009    source источник
comment
Дубликат stackoverflow.com/questions/75401/uses-of-using-in-c   -  person tvanfosson    schedule 18.02.2009
comment
Его также можно найти с помощью простого поиска в Google и в документации MSDN.   -  person Chuck Conway    schedule 18.02.2009
comment
@Charles: И ответы GIYF здесь не приветствуются.   -  person GEOCHET    schedule 18.02.2009
comment
Я согласен с Rich, мы не допускаем такой элитарности IRC. Любой вопрос - нормально, кроме того, что это обман.   -  person mmcdole    schedule 18.02.2009
comment
@Simucal, @Rich B - Перечитав свой комментарий, я понял, почему его неправильно читают. Я был искренен в своем комментарии.   -  person Chuck Conway    schedule 18.02.2009


Ответы (6)


Использование переводится примерно так:

Something mySomething = new Something();
try
{
  something.someProp = "Hey";
}
finally
{
  if(mySomething != null)
  {
    mySomething.Dispose();
  }
}

И это почти все. Цель состоит в том, чтобы поддерживать детерминированное удаление, чего нет в C #, потому что это язык со сборкой мусора. Шаблоны using / Disposal позволяют программистам точно указать, когда тип очищает свои ресурсы.

person Randolpho    schedule 18.02.2009
comment
@Randolpho, не совсем так. Объект создается вне блока try ... finally. Если объект не может быть создан, его нельзя / не нужно удалять. - person LukeH; 18.02.2009
comment
@Randolpho, И сгенерированный IL также проверит, что объект не равен нулю, прежде чем пытаться вызвать Dispose. - person LukeH; 18.02.2009
comment
Хорошие замечания, Люк. Я сделал примерно предисловие, помню .;) - person Randolpho; 18.02.2009
comment
@Randolpho, я не пытался быть придирчивым, я просто подумал, что укажу на него, потому что ваш ответ в настоящее время является самым популярным, поэтому многие люди могут в конечном итоге его прочитать. :) - person LukeH; 18.02.2009
comment
Что ж, исправил. Однако меня больше интересовало объяснение цели и контекста моего поста, так как это часто упускается из виду. - person Randolpho; 18.02.2009

Оператор using гарантирует, что Dispose () вызывается, даже если во время вызова методов объекта возникает исключение.

person Elroy    schedule 18.02.2009

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

person Jason Punyon    schedule 18.02.2009

Вы можете использовать using, когда класс Something реализует IDisposable. Это гарантирует, что объект будет размещен правильно, даже если вы столкнетесь с исключением внутри блока using.

т.е. вам не нужно вручную обрабатывать возможные исключения только для вызова Dispose, блок using сделает это за вас автоматически.

Это эквивалентно этому:

Something mySomething = new Something();
try
{
   // this is what's inside your using block
}
finally
{
    if (mySomething != null)
    {
        mySomething.Dispose();
    }
}
person LukeH    schedule 18.02.2009

Использование переводится на

try
{
   ...
}
finally
{
   myObj.Dispose();
}

при компиляции (так в IL).

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

person Gerrie Schenck    schedule 18.02.2009

Блок using - это способ гарантировать, что метод dispose объекта вызывается при выходе из блока.

Это полезно, потому что вы можете выйти из этого блока обычным образом, из-за перерывов, из-за того, что вы вернулись, или из-за исключения.

Вы можете сделать то же самое с «try / finally», но «using» проясняет, что вы имеете в виду, и не требует переменной, объявленной вне блока th.

person Craig Gidney    schedule 18.02.2009