Что лучше, и когда:используя инструкцию или вызывая Dispose() для IDisposable в C #?

StackOverflow https://stackoverflow.com/questions/1034639

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

  • ты не можешь забыть позвонить Dispose(), даже по мере того , как код эволюционирует в разные кодовые пути
  • Dispose() вызывается, даже если есть исключение.Он также проверяет наличие null перед звонком Dispose(), что может быть полезно (при условии, что вы не просто вызываете new).

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

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

Программа форматирования VS code оставит два оператора, начинающихся в одном столбце.


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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top