Возможный дубликат:
Что такое блок C # Using и зачем его использовать?
Я видел оператор using в середине кодового блока. В чем причина этого?
Возможный дубликат:
Что такое блок C # Using и зачем его использовать?
Я видел оператор using в середине кодового блока. В чем причина этого?
Синтаксис 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();
}
C # через среду CLR .NET Framework автоматически освобождает память, используемую для хранения объектов, которые больше не требуются. Освобождение памяти не является детерминированным; память освобождается всякий раз, когда среда CLR решает выполнить сборку мусора. Однако обычно лучше как можно быстрее освободить ограниченные ресурсы, такие как дескрипторы файлов и сетевые подключения.
Оператор using позволяет программисту указать, когда объекты, использующие ресурсы, должны их освободить. Объект, предоставленный оператору using, должен реализовывать интерфейс IDisposable. Этот интерфейс предоставляет метод Dispose, который должен освободить ресурсы объекта.
Часто используется при открытии соединения с потоком или базой данных.
Он ведет себя как блок try {...} finally {...}. После блока using объект IDisposable, экземпляр которого был создан в круглых скобках, будет закрыт должным образом.
using (Stream stream = new Stream(...))
{
}
В этом примере поток закрывается правильно после блока.
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();
}
Оператор using обеспечивает правильное размещение объекта, если он больше не требуется. Это в основном избавляет вас от написания obj.Dispose (); и дает наглядное руководство относительно объема и использования переменной.
Дополнительную информацию см. На странице MSDN.
Эта форма использования связана с освобождением ресурсов. Его можно использовать только в сочетании с классом, реализующим интерфейс IDisposable.
пример:
using(SqlConnection conn = new SqlConnection(someConnectionString))
{
//Do some database stuff here
}
в конце блока using вызывается conn.Dispose, даже если внутри блока было сгенерировано исключение. В случае объекта SwqlConnection означает, что соединение всегда закрыто.
Недостатком этой конструкции является то, что теперь есть способ узнать, что произошло.
Надеюсь, это поможет ответить на ваш вопрос?
Всякий раз, когда ваш код создает объект, реализующий 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.