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