2013-06-28 18 views
19

Czy instrukcja using zawsze unieszkodliwia obiekt, nawet jeśli istnieje zwrot lub wyjątek jest w nim wrzucony? Tj .:Czy instrukcja "using" zawsze usuwa obiekt?

using (var myClassInstance = new MyClass()) 
{ 
    // ... 
    return; 
} 

lub

using (var myClassInstance = new MyClass()) 
{ 
    // ... 
    throw new UnexplainedAndAnnoyingException(); 
} 

Odpowiedz

29

Tak, o to chodzi. Kompiluje się do:

SomeDisposableType obj = new SomeDisposableType(); 
try 
{ 
    // use obj 
} 
finally 
{ 
    if (obj != null) 
     ((IDisposable)obj).Dispose(); 
} 

Uważaj na swoją terminologię tutaj; sam obiekt nie jest zwolniony. Wywoływana jest metoda Dispose() i zwykle udostępniane są zasoby niezarządzane.

10

Jeśli obiekt implementuje IDisposable, zostanie wywołana.

Z using Statement (C# Reference)

definiuje zakres, poza którym przedmiot lub przedmioty zostaną usuwane.

Instrukcja using umożliwia programistom określenie, kiedy obiekty, które używają zasobów , powinny je zwolnić. Obiekt dostarczany do użycia oświadczenia musi implementować interfejs IDisposable. Ten interfejs udostępnia metodę Dispose, która powinna zwolnić zasoby obiektu .

+0

+1 za stwierdzenie, że obiekt musi zaimplementować 'IDisposable'. – Tim