Как насчет использования конструкции в C # - PullRequest
3 голосов
/ 30 марта 2010

Я вижу это:

using (StreamWriter sw = new StreamWriter("file.txt"))
{
     // d0 w0rk s0n
}

Все, что я пытаюсь найти информацию, не объясняет, что это делает, а вместо этого дает мне информацию о пространствах имен.

Ответы [ 5 ]

12 голосов
/ 30 марта 2010

Вы хотите проверить документацию для , используя оператор (вместо , используя директиву , которая касается пространств имен).

По сути, это означает, что блок преобразуется в блок try / finally, а sw.Dispose() вызывается в блоке finally (с подходящей проверкой на недействительность).

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

Несколько интересных битов о синтаксисе:

  • Вы можете получить несколько ресурсов одним оператором:

    using (Stream input = File.OpenRead("input.txt"),
           output = File.OpenWrite("output.txt"))
    {
        // Stuff
    }
    
  • Вам не нужно присваивать переменную:

    // For some suitable type returning a lock token etc
    using (padlock.Acquire())
    {
        // Stuff
    }
    
  • Вы можете вкладывать их без скобок; удобно, чтобы избежать вдавливания

    using (TextReader reader = File.OpenText("input.txt"))
    using (TextWriter writer = File.CreateText("output.txt"))
    {
        // Stuff
    }
    
10 голосов
/ 30 марта 2010

Конструкция using - это, по сути, синтаксическая оболочка для автоматического вызова dispose для объекта в пределах использования. Например, приведенный выше код примерно переводится в следующий

StreamWriter sw = new StreamWriter("file.text");
try {
  // do work 
} finally {
  if ( sw != null ) {
    sw.Dispose();
  }
}
5 голосов
/ 30 марта 2010

На ваш вопрос отвечает раздел 8.13 спецификации.

2 голосов
/ 30 марта 2010

Вот, пожалуйста: http://msdn.microsoft.com/en-us/library/yh598w02.aspx

По сути, он автоматически вызывает элемент Dispose интерфейса IDisposable в конце области использования.

0 голосов
/ 30 марта 2010
...