Что лучше и когда: используя оператор или вызывая Dispose () для IDisposable в C #? - PullRequest
6 голосов
/ 23 июня 2009

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

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

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

var ctx = DataContextFactory.Create(0);
ctx.Dispose();

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

Ответы [ 5 ]

26 голосов
/ 23 июня 2009

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

7 голосов
/ 23 июня 2009

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

  • Вы не можете забыть позвонить Dispose(), даже если код эволюционирует в разные пути кода
  • Dispose() вызывается, даже если есть исключение. Он также проверяет null перед вызовом Dispose(), что может быть полезно (при условии, что вы не просто звоните 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 .

3 голосов
/ 23 июня 2009

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

3 голосов
/ 23 июня 2009

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

2 голосов
/ 23 июня 2009

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

...