Лучше ли использовать оператор [using] в C # или метод [dispose]? Это относится к внешним (COM) объектам? - PullRequest
2 голосов
/ 25 августа 2010

Что лучше: директива using или директива dispose после завершения работы с объектом?

 using(FileStream fileStream = new FileStream(
            "logs/myapp.log",
            FileMode.Open,
            FileAccess.Read,
            FileShare.ReadWrite))
        {
            using(StreamReader streamReader = new StreamReader(fileStream))
            {
                this.textBoxLogs.Text = streamReader.ReadToEnd();
            }
        }

С другой стороны, когда я имею дело с System.Net.Mail,сказал, что мне нужно Dispose () объекта, чтобы освободить любые случайные блокировки.

Есть ли какое-либо последовательное руководство?Как мне сказать, что является более подходящим в данной ситуации для данного объекта?

Ответы [ 8 ]

9 голосов
/ 25 августа 2010

Оператор using (не директива) включает неявный вызов Dispose() в блоке finally.Так что здесь нет противоречия.Можете ли вы дать ссылку на это обсуждение?

Официальное определение
using (x) { ... }
равно
try ... finally if (x != null) x.Dispose(); }

Что лучше?1015 *

С нотационной точки зрения блок using() { }.Технически они одинаковы.

5 голосов
/ 25 августа 2010

Нет причин думать, что я могу вручную вызвать Dispose(), кроме как в другой реализации Dispose() (например, в созданном вами классе, который реализует IDisposable), когда вы можете обернуть объект вusing блок.Блок using помещает создание и удаление объекта в блоке try / catch / finally в в значительной степени гарантию того, что объект будет удален правильно.

Компиляторнадежнее меня.Или ты.=)

MSDN документирует с помощью оператора и вызывает, где вы можете получить спецификацию языка C # , где вы можете просмотреть раздел 8.13 «Оператор использования»(по крайней мере в справочнике v4.0 это 8.13), который дает исчерпывающее объяснение оператора using и как его использовать.Пятый абзац дает следующее:

Заявление об использовании переводится на три части: приобретение, использование и удаление.Использование ресурса неявно заключено в оператор try, который включает предложение finally.Это, наконец, пункт распоряжается ресурсом.Если нулевой ресурс получен, то вызов Dispose не выполняется и исключение не выдается.

5 голосов
/ 25 августа 2010

Это то же самое. Использование простое, если вы создаете объект и используете его только в одном методе, используйте use. Если вам нужно сохранить его после вызова метода, тогда вы должны использовать Dispose ().

Оборачиваемые вызываемые оболочки для COM-объектов не имеют метода Dispose ().

2 голосов
/ 25 августа 2010

Пока время жизни объекта находится в блоке кода, используйте using, если ваш объект должен быть долгоживущим, например, для удаления после асинхронного вызова вам нужно вручную вызвать Dispose.

Блок using намного лучше, чем вы помните вызов Dispose всеми возможными и невозможными способами, когда выполнение может оставить блок кода.

2 голосов
/ 25 августа 2010
using(foo) 
{
    foo.DoStuff();
}

- это просто синтаксический сахар для этого:

try
{
    foo.DoStuff();
}
finally
{
    if(foo != null)
        foo.Dispose();
}

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

2 голосов
/ 25 августа 2010

using блоки автоматически вызывают Dispose() при достижении конца блока.

2 голосов
/ 25 августа 2010

используя вызовы Утилизировать при выходе. использование лучше, потому что это обеспечивает вызов dispose.

1 голос
/ 25 августа 2010

Существует одна очень важная причина использовать «оператор using» везде, где вы можете.

Если код, перенесенный с помощью оператора using, выдает исключение, вы можете быть уверены, что «объект использования» будетрасположенных.

...