2009-02-18 37 views
5

dupe: Uses of "using" in C#Jaki jest cel używania?

Widziałem ludzi korzysta z następujących i zastanawiam się jaki jest jej cel? Czy to dlatego, że obiekt jest niszczony po jego użyciu przez odśmiecanie?

przykład:

using (Something mySomething = new Something()) { 
    mySomething.someProp = "Hey"; 
} 
+0

Duplikat http://stackoverflow.com/questions/75401/uses-of-using-in-c – tvanfosson

+0

Znajduje się również w prostym wyszukiwaniu Google oraz w dokumentacji MSDN. –

+0

@Charles: Odpowiedzi GIYF nie są tu mile widziane. – GEOCHET

Odpowiedz

2

instrukcji using ma korzystny efekt usuwania, co jest w() po zakończeniu za pomocą bloku.

4

Instrukcja using zapewnia wywołanie Dispose(), nawet jeśli wystąpi wyjątek podczas wywoływania metod na obiekcie.

2

Możesz użyć using, gdy klasa Something implementuje IDisposable. Zapewnia poprawne usunięcie obiektu, nawet jeśli trafisz na wyjątek wewnątrz bloku using.

Oznacza to, że nie musisz ręcznie obsługiwać potencjalnych wyjątków, aby zadzwonić pod numer Dispose, blok using zrobi to automatycznie.

Jest to odpowiednik tego:

Something mySomething = new Something(); 
try 
{ 
    // this is what's inside your using block 
} 
finally 
{ 
    if (mySomething != null) 
    { 
     mySomething.Dispose(); 
    } 
} 
6

Korzystanie przekłada się mniej więcej do:

Something mySomething = new Something(); 
try 
{ 
    something.someProp = "Hey"; 
} 
finally 
{ 
    if(mySomething != null) 
    { 
    mySomething.Dispose(); 
    } 
} 

i to dość dużo. Celem jest wspieranie deterministycznego usuwania, czegoś, czego nie ma C#, ponieważ jest to język gromadzący śmieci. Wzorce używania/usuwania dają programiście możliwość dokładnego określenia, kiedy typ czyści swoje zasoby.

+0

@Randolpho, Niezupełnie. Obiekt jest tworzony poza blokiem try ... finally. Jeśli obiekt nie może wykonać instancji, nie może/nie musi być usuwany. – LukeH

+0

@Randolpho, a wygenerowany IL sprawdzi także, czy obiekt nie jest pusty przed próbą wywołania Dispose. – LukeH

+0

Dobrze, Luke. Zrobiłem przedmowę z "grubsza", pamiętam;) – Randolpho

1

Korzystanie dostaje języku

try 
{ 
    ... 
} 
finally 
{ 
    myObj.Dispose(); 
} 

podczas kompilacji (tak w IL).

Zasadniczo powinieneś go używać z każdym obiektem, który implementuje IDisposable.

0

Blok "używanie" jest sposobem zagwarantowania, że ​​metoda "utylizacji" obiektu zostanie wywołana przy wychodzeniu z bloku.

Przydaje się, ponieważ możesz wyjść z tego bloku normalnie, z powodu przerw, ponieważ powróciłeś lub z powodu wyjątku.

Możesz zrobić to samo z "try/finally", ale "using" sprawia, że ​​jest ono bardziej zrozumiałe i nie wymaga zmiennej zadeklarowanej poza blokiem.