Использование оператора using в C #

Возможный дубликат:
Что такое блок C # Using и зачем его использовать?

Я видел оператор using в середине кодового блока. В чем причина этого?


person FendFend    schedule 05.03.2009    source источник
comment
Вы искали здесь, в Stack Overflow?   -  person Dave Van den Eynde    schedule 05.03.2009
comment
Дубликат: stackoverflow.com/questions/212198/   -  person Daniel Earwicker    schedule 05.03.2009
comment
stackoverflow.com/questions/212198/   -  person Daniel Earwicker    schedule 05.03.2009
comment
Когда я начал вводить вопрос, ничего не возникло   -  person FendFend    schedule 05.03.2009
comment
@FendFend: используйте Google. Включите site: stackoverflow.com в свой поиск. Функция полнотекстового поиска на SO не работает.   -  person Michael Kniskern    schedule 26.03.2009
comment
Работает нормально. Я набрал C #, используя поле поиска SO, и он вернулся с кучей соответствующих ответов. У номера 4 был тот же ответ, который скопировал и вставил @cgreeno.   -  person TFD    schedule 03.01.2010
comment
@TFD: Чувак, это так глупо. Разве для этого нет значка? Вы получили значок «Ниндзя» за то, что получили представителей для ответа другого пользователя. ;-)   -  person Zano    schedule 26.01.2010
comment
@Michael Kniskern Я ничего не копировал и не вставлял, сколько разных способов вы можете реализовать оператор using и / или показать, что это то же самое, что и попытка ...   -  person cgreeno    schedule 26.01.2010
comment
@cgreeno - Я думаю, ты дал повод не тому человеку. Тебя вызывал TFD, а не я.   -  person Michael Kniskern    schedule 28.01.2010


Ответы (6)


Синтаксис using может (должен) использоваться как способ определения области для всего, что реализует IDisposable. Оператор using обеспечивает вызов метода Dispose в случае возникновения исключения.

    //the compiler will create a local variable 
    //which will go out of scope outside this context 
    using (FileStream fs = new FileStream(file, FileMode.Open))
    {
         //do stuff
    }

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

    FileStream fs;
    try{
       fs = new FileStream();
       //do Stuff
    }
    finally{
        if(fs!=null)
           fs.Dispose();
    }

Дополнительное чтение из MSDN

C # через среду CLR .NET Framework автоматически освобождает память, используемую для хранения объектов, которые больше не требуются. Освобождение памяти не является детерминированным; память освобождается всякий раз, когда среда CLR решает выполнить сборку мусора. Однако обычно лучше как можно быстрее освободить ограниченные ресурсы, такие как дескрипторы файлов и сетевые подключения.

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

person cgreeno    schedule 05.03.2009
comment
+1 - хороший ответ - важно отметить, что компилятор фактически заменяет оператор using на try / finally. - person Andrew Hare; 05.03.2009

Часто используется при открытии соединения с потоком или базой данных.

Он ведет себя как блок try {...} finally {...}. После блока using объект IDisposable, экземпляр которого был создан в круглых скобках, будет закрыт должным образом.

using (Stream stream = new Stream(...))
{


}

В этом примере поток закрывается правильно после блока.

person mbillard    schedule 05.03.2009

using, наконец, попробуйте синтаксический suger для всего, что имеет IDisposable .. например, sqlconnection. Его использование гарантирует, что что-то удаляется после того, как оно выходит за пределы using(){}.

using(SqlConnection conn = new SqlConnection(connString))
{
  //use connection
}

//shorter than

SqlConnection conn = new SqlConnection(connString)
try
{
  //use connection 
}
finally
{
    conn.Dispose();
}
person Hath    schedule 05.03.2009

Оператор using обеспечивает правильное размещение объекта, если он больше не требуется. Это в основном избавляет вас от написания obj.Dispose (); и дает наглядное руководство относительно объема и использования переменной.

Дополнительную информацию см. На странице MSDN.

person Greg B    schedule 05.03.2009

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

пример:

using(SqlConnection conn = new SqlConnection(someConnectionString))
{
     //Do some database stuff here
}

в конце блока using вызывается conn.Dispose, даже если внутри блока было сгенерировано исключение. В случае объекта SwqlConnection означает, что соединение всегда закрыто.

Недостатком этой конструкции является то, что теперь есть способ узнать, что произошло.

Надеюсь, это поможет ответить на ваш вопрос?

person Norbert B.    schedule 05.03.2009

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

Есть одно исключение из этого правила. Ошибка в конструкции прокси-классов WCF не позволяет использовать инструкции для прокси-классов. Вкратце, метод Dispose в прокси-классе может вызвать исключение. Команда WCF не видела причин не допустить этого.

К сожалению, отсутствие причины не означает, что ее нет:

try
{
    using (var svc = new ServiceReference.ServiceName())
    {
        throw new Exception("Testing");
    }
}
catch (Exception ex)
{
    // What exception is caught here?
}

Если неявный вызов Dispose вызывает исключение, то блок catch перехватит это исключение вместо того, которое было выбрано в блоке using.

person John Saunders    schedule 05.03.2009