2009-06-23 13 views

Odpowiedz

26

Pierwsza jest lepsza. Zapewnia to, że jest on usuwany, nawet jeśli zostanie zgłoszony wyjątek, i poprawnie obsługuje przypadek, w którym Create(0) zwraca wartość null (tj. Nie próbuje wywoływać Dispose() w instancji zerowej).

+0

Dziękujemy! To był po prostu rodzaj odpowiedzi, której szukałem. – mkelley33

+11

Dodatkowym pomniejszym punktem, o którym nikt nie wspomniał, jest to, że użycie "używania" zapobiega przypadkowemu mutowaniu zawartości zmiennej "ctx" po jej inicjalizacji, ale przed jej usunięciem. Nie chcesz przypadkowo pozbyć się innego obiektu niż utworzony. –

2

Instrukcja using daje ładną składnię oraz ochronę wyjątków. Nie możesz opuścić instrukcji using bez wywoływania Dispose (przekłada się to na blok finally z wezwaniem do usunięcia). W twoim drugim scenariuszu, jeśli miałeś wyjątek pomiędzy tworzeniem a usuwaniem, nie zadzwoniłbyś bezpośrednio do dyspozycji. Co nie jest problemem, chyba że korzystasz z zasobów niezarządzanych, ale jeśli tak, to przeciekasz.

3

Gdzie można, użyj using z powodów, które wymienia Marc. OTOH to nie jest rozwiązanie polegające na martwym mózgu, ponieważ czasami czas życia obiektu nie może być zdefiniowany jako zakres leksykalny, więc używaj go w rozsądny sposób.

3

Jedynym miejscem, w którym nie chcesz używać bloku użytego, jest miejsce, w którym obiekt do dyspozycji jest poza zasięgiem funkcji. W takim przypadku twoja klasa powinna wdrożyć IDisposable i zutylizować obiekt w jego Dispose().

+0

Natknąłem się na przypadki, w których czas życia obiektu jest krótszy niż czas życia właściciela. – BCS

7

using stwierdzenie jest zawsze lepiej, bo ...

  • nie można zapomnieć zadzwonić Dispose(), nawet jako kod ewoluuje w różnych ścieżkach kodu
  • Dispose() zostanie wywołany, nawet jeśli nie jest wyjątkiem. Sprawdza również przed null przed wywołaniem Dispose(), które mogą być przydatne (zakładając, że nie tylko dzwonisz pod numer new).

Jeden nieoczywiste (dla mnie w każdym razie) sztuczka z using sposób można uniknąć nadmiernego zagnieżdżania gdy masz wiele przedmiotów jednorazowych:

using (var input = new InputFile(inputName)) 
using (var output = new OutputFile(outputName)) 
{ 
    input.copyTo(output); 
} 

Kod formater VS opuści dwa oświadczenia począwszy w tej samej kolumnie.


W rzeczywistości, w niektórych sytuacjach nawet nie trzeba powtarzać using ...

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2)) 

Jednakże ograniczenia do deklarowania wielu zmiennych na tej samej linii obowiązuje tu więc typy muszą być takie same i nie można użyć domyślnego typu var.

Powiązane problemy