2008-11-25 18 views
23

Chciałbym wiedzieć, kiedy powinienem i nie powinienem owijać rzeczy w bloku USING.C# USING keyword - kiedy i kiedy go nie używać?

Z tego co rozumiem, kompilator tłumaczy go na próbę/finally, gdzie ostatecznie wywołuje Dispose() na obiekcie.

Zawsze używam KORZYSTAĆ z połączeń bazy danych i dostępu do plików, ale bardziej z przyzwyczajenia niż z 100% zrozumienia. Wiem, że powinieneś explicit (lub przy użyciu) Dispose() obiektów, które kontrolują zasoby, aby zapewnić, że są one uwalniane natychmiast, a nie kiedy CLR czuje się jak to, ale to gdzie moje zrozumienie zepsuje.

Czy IDisposables nie są usuwane, gdy wykraczają poza zakres?

Czy muszę użyć USINGU tylko wtedy, gdy mój obiekt wykorzystuje funkcję Dispose do uporządkowania się?

Dzięki

Edit: Wiem, że istnieje kilka innych stanowisk w kluczowych używają, ale jestem bardziej zainteresowany w odpowiedzi odnoszącej CLR i dokładnie co się dzieje wewnętrznie

Andrew

Odpowiedz

21

Nie, IDisposable przedmioty nie są usuwane, gdy wykraczają poza zakres. Właśnie z tego powodu potrzebujemy IDisposable - do oczyszczania deterministycznego.

Będą ostatecznie uzyskać śmieci zebrane, a jeśli jest finalizator będzie (być może) nazywane - ale to może być długi czas w przyszłości (nie jest dobre dla pul połączeń itp.). Odbiór śmieci zależy od ciśnienia w pamięci - jeśli nic nie potrzebuje dodatkowej pamięci, nie ma potrzeby uruchamiania cyklu GC.

Co ciekawe (być może) zdarzają się przypadki, w których "używanie" jest bolesne - gdy klasa naruszająca zasady wyrzuca wyjątek na Dispose(). WCF jest sprawcą tego. Omówiłem ten temat (z prostym obejściem) here.

zasadzie - jeśli klasa implementuje IDisposable, a ty własny instancji (czyli go lub cokolwiek stworzył), to jest zadanie, aby zapewnić, że zostanie usunięte. Może to oznaczać "używanie" lub może oznaczać przekazanie go do innego fragmentu kodu, który bierze na siebie odpowiedzialność.

ja faktycznie widać kod debugowania typu: "Czy IDisposables nie unieszkodliwić gdy idą poza zakresem"

#if DEBUG 
    ~Foo() { 
     // complain loudly that smoebody forgot to dispose... 
    } 
#endif 

(gdzie Dispose rozmowy GC.SuppressFinalize)

+0

A jeśli użyjecie tej techniki, proszę, proszę, proszę nie zapomnieć "#if DEBUG". To ty, myślę o JetBrains, z twoimi 30000 obiektami w kolejce finalizatora Visual Studio ... –

+2

To niefortunne. –

+0

+1, chciałbym zrobić więcej niż 1 głos w górę: p ... doskonała wiedza jest udostępniana na stackoverlow .... jest po prostu świetna ... –

5

nr Jeżeli obiekt jest IDisposable finalizable, która nie jest to samo, to zostanie sfinalizowana, gdy jest to śmieci zebrane.

Co może być niedługo lub może być prawie nigdy.

Książka Jeffa Richtera w języku C#/CLR jest bardzo dobra we wszystkich tych sprawach, a książka Framework Design Guidelines jest również przydatna.

Czy wystarczy użyć using kiedy mój obiektu sprawia, że ​​korzystanie z Zużyty sprzątać sam się?

Można tylko stosowanie 'używanie', gdy obiekt implementuje IDisposable. Kompilator zaprotestuje, jeśli spróbujesz inaczej.

2

Aby dodać do innych odpowiedzi, należy użyć using (lub wyraźnej dyspozycji), gdy obiekt przechowuje zasoby inne niż zarządzana pamięć. Przykładami mogą być pliki, gniazda, połączenia z bazami danych, a nawet uchwyty do rysowania GDI.

Śmieciarz ostatecznie sfinalizuje te obiekty, ale tylko w nieokreślonym czasie w przyszłości. Nie można polegać na tym, że dzieje się to w odpowiednim czasie, a tymczasem w tym czasie mógłbyś skończyć z tym zasobem.

+2

Prawdopodobnie powinieneś po prostu używać "używając", gdy klasa implementuje IDisposable. To, co robi, to szczegół implementacji ;-p Jest to * finalizator *, który powinieneś dodać tylko wtedy, gdy twoja klasa owija niezarządzany zasób. Istnieją przykłady IDisposable w czysto zarządzanym kodzie ... –

+0

Miły komentarz, powinien był zrobić odpowiedź dla jakiegoś głosowania miłość xx –

+0

Marc: masz rację. Sądzę, że naprawdę próbowałem wyjaśnić motywację, dla której wykonawca mógł stworzyć IDisposable klasy, zamiast zbierania śmieci, rozwiązując wszystkie problemy z zarządzaniem zasobami. – babbageclunk

Powiązane problemy