Użytkownik kokos odpowiedział na cudowne Ukryte funkcje pytania C # , podając using
słowo kluczowe. Czy możesz to rozwinąć? Jakie są zastosowania using
?
c#
using
using-statement
ubermonkey
źródło
źródło
Odpowiedzi:
Powodem tego
using
stwierdzenia jest upewnienie się, że obiekt jest usuwany, gdy tylko znajdzie się poza zasięgiem, i nie wymaga jawnego kodu, aby mieć pewność, że tak się stanie.Podobnie jak w Zrozumienie instrukcji „using” w języku C # (projekt kodu) i Korzystanie z obiektów, które implementują IDisposable (Microsoft) , kompilator C # konwertuje
do
C # 8 wprowadza nową składnię o nazwie „ using declarations ”:
Więc równoważny kod powyższy byłby:
A gdy kontrola opuści zawarty zakres (zwykle jest to metoda, ale może to być również blok kodu),
myRes
zostanie usunięta.źródło
using
upewnia się, żeDispose
jest wywoływane, gdy skończysz z obiektem.MyRessource
jest strukturą. Oczywiście nie ma testu na nieważność, ale również nie ma możliwości boksowaniaIDisposable
. Emitowane jest ograniczone połączenie wirtualne.using
zmiennej, wbudowana w nią zmienna jest tylko do odczytu. Nie ma sposobu na osiągnięcie tego dla zmiennych lokalnych bezusing
instrukcji.Ponieważ wiele osób nadal:
Myślę, że wiele osób wciąż nie wie, że możesz to zrobić:
źródło
Takie rzeczy:
To
SqlConnection
będzie zamknięty bez konieczności jawnie wywołać.Close()
funkcję, a stanie się to nawet jeśli jest wyjątek , bez konieczności dotyczącytry
/catch
/finally
.źródło
return
w środkuusing
bloku.można użyć do wywołania IDisposable. Może być również używany do typów aliasów.
źródło
za pomocą, w sensie
Jest tak naprawdę skrótem dla bloku try / wreszcie. Jest to równoważne z kodem:
Zauważysz oczywiście, że pierwszy fragment jest znacznie bardziej zwięzły niż drugi, a także, że istnieje wiele rodzajów rzeczy, które możesz zrobić jako czyszczenie, nawet jeśli zostanie zgłoszony wyjątek. Z tego powodu stworzyliśmy klasę, którą nazywamy Scope, która pozwala na wykonanie dowolnego kodu w metodzie Dispose. Na przykład, jeśli masz właściwość IsWorking, którą zawsze chciałeś ustawić na false po próbie wykonania operacji, zrobiłbyś to w ten sposób:
Możesz przeczytać więcej o naszym rozwiązaniu i sposobie jego uzyskania tutaj .
źródło
Dokumentacja Microsoft stwierdza, że używanie ma podwójną funkcję ( https://msdn.microsoft.com/en-us/library/zhdeatwt.aspx ), zarówno jako dyrektywę, jak i w instrukcjach . Jako stwierdzenie , jak wskazano tutaj w innych odpowiedziach, słowem kluczowym jest cukier składniowy w celu ustalenia zakresu dysponowania obiektem IDisposable . Jako dyrektywa jest rutynowo używana do importowania przestrzeni nazw i typów. Również jako dyrektywę możesz tworzyć aliasy dla przestrzeni nazw i typów, jak wskazano w książce „C # 5.0 In a Nutshell: The Definitive Guide” ( http://www.amazon.com/5-0-Nutshell-The- Definitive-Reference-ebook / dp / B008E6I1K8), Joseph i Ben Albahari. Jeden przykład:
Jest to coś, co należy mądrze zastosować, ponieważ nadużywanie tej praktyki może zaszkodzić przejrzystości kodu. Jest ładne wyjaśnienie na temat aliasów C #, wymieniając również zalety i wady, w DotNetPearls ( http://www.dotnetperls.com/using-alias ).
źródło
using
jako narzędzia aliasu. To dezorientuje mnie podczas czytania kodu - już wiem, żeSystem.Collections
istnieje i maIEnumerable<T>
klasę. Używanie aliasu, aby nazwać to czymś innym, zaciemnia to dla mnie. Widzęusing FooCollection = IEnumerable<Foo>
jako sposób na to, aby późniejsi programiści przeczytali kod i pomyśleli: „Co to do diabła jestFooCollection
i dlaczego nie ma gdzieś klasy?” Nigdy go nie używam i odradzałbym jego użycie. Ale to może być tylko ja.W przeszłości często go używałem do pracy ze strumieniami wejściowymi i wyjściowymi. Możesz je ładnie zagnieździć, a to eliminuje wiele potencjalnych problemów, na które zwykle napotykasz (automatycznie wywołując dispose). Na przykład:
źródło
Dodanie czegoś, co mnie zaskoczyło, nie pojawiło się. Najbardziej interesującą cechą używania (moim zdaniem) jest to, że bez względu na to, jak wyjdziesz z używanego bloku, zawsze pozbywa się on obiektu. Obejmuje to zwroty i wyjątki.
Nie ma znaczenia, czy wyjątek zostanie zgłoszony, czy lista zostanie zwrócona. Obiekt DbContext zawsze będzie usuwany.
źródło
Innym doskonałym zastosowaniem use jest tworzenie instancji modalnego okna dialogowego.
źródło
Podsumowując, kiedy używasz zmiennej lokalnej typu, która implementuje
IDisposable
, zawsze bez wyjątku używajusing
1 .Jeśli używasz
IDisposable
zmiennych nielokalnych , zawsze implementujIDisposable
wzorzec .Dwie proste zasady, bez wyjątku 1 . W przeciwnym razie zapobieganie wyciekom zasobów jest prawdziwym problemem.
1) : Jedynym wyjątkiem jest - gdy zajmujesz się wyjątkami. Może wtedy być mniej kodu do
Dispose
jawnego wywołania wfinally
bloku.źródło
Możesz skorzystać z przestrzeni nazw aliasu w następujący sposób:
Nazywa się to dyrektywą aliasową, jak widać, można ją wykorzystać do ukrycia od dawna odwoływanych referencji, jeśli chcesz, aby w kodzie było oczywiste, do czego się odwołujesz np.
zamiast
lub po prostu
źródło
Co ciekawe, możesz również użyć wzorca using / IDisposable do innych interesujących rzeczy (takich jak inny sposób, w jaki używa go Rhino Mocks). Zasadniczo możesz skorzystać z faktu, że kompilator zawsze wywoła funkcję .Dispozycjonuje na „używanym” obiekcie. Jeśli masz coś, co musi się wydarzyć po określonej operacji ... coś, co ma określony początek i koniec ... to możesz po prostu stworzyć IDisposable klasę, która rozpoczyna operację w konstruktorze, a następnie kończy się w metodzie Dispose.
Pozwala to na użycie naprawdę miłej składni przy oznaczaniu wyraźnego początku i końca tej operacji. Tak działa również funkcja System.Transactions.
źródło
Korzystając z ADO.NET, możesz użyć klucza do takich rzeczy, jak obiekt połączenia lub obiekt czytnika. W ten sposób, gdy blok kodu zostanie ukończony, automatycznie pozbędzie się twojego połączenia.
źródło
„using” może także służyć do rozwiązywania konfliktów przestrzeni nazw. Zobacz http://www.davidarno.org/c-howtos/aliases-overcoming-name-conflicts/ dla krótkiego samouczka, który napisałem na ten temat.
źródło
źródło
użycie jest używane, gdy masz zasób, który chcesz pozbyć się po jego użyciu.
Na przykład, jeśli alokujesz zasób pliku i potrzebujesz go użyć tylko w jednej sekcji kodu do krótkiego czytania lub pisania, użycie jest pomocne w usuwaniu zasobu pliku, gdy tylko to zrobisz.
Używany zasób musi zaimplementować IDisposable, aby działać poprawnie.
Przykład:
źródło
Słowo kluczowe using definiuje zakres obiektu, a następnie usuwa obiekt po zakończeniu zakresu. Na przykład.
Zobacz tutaj artykuł MSDN na temat C # za pomocą słowa kluczowego.
źródło
Nie jest to bardzo ważne, ale można go również używać do zmiany zasobów w locie. Tak, jednorazowe, jak wspomniano wcześniej, ale być może nie chcesz, aby zasoby były niezgodne z innymi zasobami podczas reszty egzekucji. Więc chcesz się go pozbyć, aby nie ingerował gdzie indziej.
źródło
Dzięki komentarzom poniżej trochę posprzątam ten post (nie powinienem wtedy używać słów „odśmiecanie”, przepraszam):
Gdy użyjesz, wywoła metodę Dispose () na obiekcie na końcu zakresu użycia. Więc możesz mieć całkiem niezły kod czyszczenia w metodzie Dispose ().
Punkt kulisty tutaj, który, mam nadzieję, może uzyskać to niezaznaczone: Jeśli zaimplementujesz IDisposable, upewnij się, że wywołujesz GC.SuppressFinalize () w implementacji Dispose (), ponieważ w przeciwnym razie nastąpi automatyczne odśmiecanie i finalizacja go w pewnym momencie punkt, który przynajmniej byłby marnotrawstwem zasobów, jeśli już go pozbyłeś () d.
źródło
Kolejny przykład racjonalnego wykorzystania, w którym obiekt jest natychmiast usuwany:
źródło
Wszystko poza nawiasami klamrowymi jest usuwane, więc świetnie jest pozbyć się przedmiotów, jeśli ich nie używasz. Dzieje się tak, ponieważ jeśli masz obiekt SqlDataAdapter i używasz go tylko raz w cyklu życia aplikacji i wypełniasz tylko jeden zestaw danych, a nie potrzebujesz go już, możesz użyć kodu:
źródło
Instrukcja using zapewnia mechanizm wygody do prawidłowego używania obiektów IDisposable. Z reguły, gdy używasz obiektu IDisposable, powinieneś zadeklarować go i utworzyć jego instancję w instrukcji using. Instrukcja using wywołuje metodę Dispose na obiekcie we właściwy sposób i (gdy używasz go, jak pokazano wcześniej), powoduje on również, że sam obiekt wykracza poza zasięg natychmiast po wywołaniu Dispose. W używanym bloku obiekt jest tylko do odczytu i nie można go modyfikować ani ponownie przypisywać.
To pochodzi z: tutaj
źródło
Dla mnie nazwa „używanie” jest nieco myląca, ponieważ może to być dyrektywa do importowania przestrzeni nazw lub instrukcji (takiej jak ta omówiona tutaj) do obsługi błędów.
Inna nazwa obsługi błędów byłaby miła, a może bardziej oczywista.
źródło
Można go również wykorzystać do tworzenia zakresów na przykład:
źródło
Instrukcja using mówi .NET, aby zwolnił obiekt określony w bloku using, gdy nie jest już potrzebny. Dlatego powinieneś użyć bloku „using” dla klas, które wymagają czyszczenia po nich, takich jak Typy System.IO.
źródło
Istnieją dwa sposoby użycia tego
using
słowa kluczowego w języku C # w następujący sposób.Jako dyrektywa
Zasadniczo używamy
using
słowa kluczowego, aby dodawać przestrzenie nazw w plikach kodu i klasach. Następnie udostępnia wszystkie klasy, interfejsy i klasy abstrakcyjne oraz ich metody i właściwości na bieżącej stronie.Przykład:
Jako oświadczenie
Jest to inny sposób użycia
using
słowa kluczowego w języku C #. Odgrywa istotną rolę w poprawie wydajności w Garbage Collection.Do
using
rachunku zapewnia, że Dispose () jest wywoływana nawet jeśli wystąpi wyjątek podczas tworzenia obiektów i wywoływanie metod, właściwości i tak dalej. Dispose () to metoda obecna w interfejsie IDisposable, która pomaga zaimplementować niestandardowe czyszczenie pamięci. Innymi słowy, jeśli wykonuję jakieś operacje na bazie danych (Wstaw, Aktualizuj, Usuń), ale jakoś występuje wyjątek, to tutaj instrukcja using zamyka połączenie automatycznie. Nie trzeba jawnie wywoływać metody Close () połączenia.Innym ważnym czynnikiem jest to, że pomaga w tworzeniu puli połączeń. Pula połączeń w .NET pomaga wielokrotnie eliminować zamykanie połączenia z bazą danych. Wysyła obiekt połączenia do puli do wykorzystania w przyszłości (następne wywołanie bazy danych). Przy następnym wywołaniu połączenia z bazą danych z aplikacji pula połączeń pobiera obiekty dostępne w puli. Pomaga to poprawić wydajność aplikacji. Kiedy więc używamy instrukcji using, kontroler wysyła obiekt do puli połączeń automatycznie, nie ma potrzeby jawnego wywoływania metod Close () i Dispose ().
Możesz zrobić to samo, co robi instrukcja using, używając bloku try-catch i wywołać jawnie funkcję Dispose () w ostatnim bloku. Ale instrukcja using wykonuje wywołania automatycznie, aby kod był czystszy i bardziej elegancki. W używanym bloku obiekt jest tylko do odczytu i nie można go modyfikować ani ponownie przypisywać.
Przykład:
W poprzednim kodzie nie zamykam żadnego połączenia; zamknie się automatycznie.
using
Oświadczenie wezwie conn.Close () automatycznie ze względu nausing
rachunku (using (SqlConnection conn = new SqlConnection(connString)
) i taka sama dla obiektu SqlDataReader. A także jeśli wystąpi jakiś wyjątek, połączenie zostanie automatycznie zamknięte.Aby uzyskać więcej informacji, zobacz Wykorzystanie i znaczenie używania w języku C # .
źródło
Rhino Mocks Record-odtwarzanie Składnia sprawia ciekawą wykorzystanie
using
.źródło
CLR konwertuje kod na MSIL. A instrukcja using zostaje przetłumaczona na try i wreszcie blok. W ten sposób instrukcja using jest reprezentowana w IL. Instrukcja użytkowania jest tłumaczona na trzy części: nabywanie, użytkowanie i usuwanie. Najpierw pozyskiwany jest zasób, a następnie użycie jest ujęte w instrukcji try z klauzulą final. Obiekt zostaje następnie umieszczony w klauzuli ostatecznie.
źródło
Użycie klauzuli służy do zdefiniowania zakresu dla konkretnej zmiennej. Na przykład:
źródło