Използване на израза 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 Не съм копирал и поставял нищо по колко различни начина можете да приложите израз за използване и/или да покажете, че е същото като опитайте окончателно....   -  person cgreeno    schedule 26.01.2010
comment
@cgreeno - Мисля, че си дал вонята на грешния човек. ТФД те викаше, не аз.   -  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#, чрез .NET Framework Common Language Runtime (CLR), автоматично освобождава паметта, използвана за съхраняване на обекти, които вече не са необходими. Освобождаването на паметта е недетерминирано; паметта се освобождава всеки път, когато CLR реши да извърши събиране на отпадъци. Въпреки това обикновено е най-добре да освободите ограничени ресурси, като файлови манипулатори и мрежови връзки, възможно най-бързо.

Инструкцията за използване позволява на програмиста да посочи кога обектите, които използват ресурси, трябва да ги освободят. Обектът, предоставен на израза за използване, трябва да имплементира интерфейса 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

използване е опитайте окончателно синтаксичен 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

Инструкцията за използване гарантира, че даден обект е правилно изхвърлен, след като вече не е необходим. Това основно ви спестява писането obj.Dispose(); и дава визуално ръководство за обхвата и използването на променлива.

Вижте страницата на MSDN за повече информация

person Greg B    schedule 05.03.2009

Тази форма на използване е свързана с освобождаване на ресурси. Може да се използва само в комбинация с клас, който имплементира интерфейса IDisposable.

пример:

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

в края на използващия блок се извиква conn.Dispose, дори ако вътре в блока е хвърлено изключение. В случай на обект SwqlConnection означава, че връзката винаги е затворена.

Недостатък на тази конструкция е, че вече има начин да разберем какво се е случило.

Надяваме се, че това помага да отговорите на въпроса си?

person Norbert B.    schedule 05.03.2009

Всеки път, когато вашият код създава обект, който имплементира 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.

person John Saunders    schedule 05.03.2009