Вопрос по .net, c#, asp.net, using-statement, idisposable – Что лучше и когда: используя оператор или вызывая Dispose () для IDisposable в C #?

6

Предположим, у меня есть следующее:

<code>using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }
</code>

Почему бы просто не сделать следующее и не потерять пару фигурных скобок ?:

<code>var ctx = DataContextFactory.Create(0);
ctx.Dispose();
</code>

Спасибо за совет!

Ваш Ответ

5   ответов
3

using по причинам, которые цитирует Марк. ОТО, это не решение для мертвого мозга, так как иногда время жизни объекта не может быть определено как лексическая область, поэтому используйте его разумно.

26

исключения и корректно обрабатывает случай, когдаCreate(0) возвращает ноль (то есть он не пытается вызватьDispose() на нулевом экземпляре).

Спасибо! Это был просто ответ, который я искал. mkelley33
Дополнительным второстепенным моментом, о котором никто не упомянул, является то, что при использовании «используя» предотвращает случайное изменение содержимого переменной & quot; ctx & quot; после его инициализации, но до его утилизации. Вы не хотите случайно удалить объект, отличный от созданного вами.
3

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

Я сталкивался со случаями, когда время жизни объекта короче, чем время жизни владельца.
7

using утверждение всегда лучше, потому что ...

  • you can't forget to call Dispose(), even as the code evolves into different code paths
  • Dispose() gets called even if there's an exception. It also checks for null before calling Dispose(), which may be useful (assuming you're not just calling new).

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

using (var input = new InputFile(inputName))
using (var output = new OutputFile(outputName))
{
    input.copyTo(output);
}

Форматировщик кода VS оставит два оператора, начинающихся в одном столбце.


Фактически, в некоторых ситуациях вам даже не нужно повторять оператор using ...

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))

Однако здесь применяются ограничения для объявления нескольких переменных в одной строке, поэтому типы должны быть одинаковыми, и вы не можете использовать неявный тип.var.

2

Оператор using обеспечивает хороший синтаксис и защиту от исключений. Вы не можете оставить оператор using без вызова Dispose (он преобразуется в блок finally с вызовом dispose). Во втором сценарии, если у вас возникла исключительная ситуация между Create и Dispose, вы бы не вызывали dispose напрямую. Что не является проблемой, если вы не используете неуправляемые ресурсы, но если вы это сделаете, вы будете течь.

Похожие вопросы