Gdy nie chcemy definiować złożonych klas, takich jak metody złożone, zdarzenia czy konstruktory, możemy dynamicznie wygenerować niestandardowy typ danych -> anonimowy typ.
1. Określ rodzaj anonimowości
Definiując anonimowy typ, musisz użyć słowa kluczowego var oraz składni inicjalizacji obiektów.
var: Kompilator automatycznie generuje nową definicję klasy podczas kompilacji (nie widzimy nazwy klasy w kodzie C#).
Inicjalizacja: Kompilator powie o utworzeniu prywatnych pól tła i (tylko do odczytu) właściwości dla nowo utworzonego typu.
Skonstruuj anonimowy typ poprzez przekazanie parametrów i wydrukowanie odpowiednich informacji
Call: Typy anonimowe można również budować przy użyciu hardkodu
2. Wewnętrzna reprezentacja anonimowych typów
Wszystkie anonimowe typy automatycznie dziedziczą z obiektu, więc możemy użyć ToString, GetHashCode, Equals na obiekcie samochodu, spróbujmy to nazwać:
Rozmowy i wyniki:
Typ obiektu samochodu to: <>f__AnonymousType03 (Twój może być inny), anonimowa nazwa typu jest odczuwana przez kompilator, nie możemy ingerować, kod CIL.
3. Implementacja metod ToString() i GetHashCode().
1.ToString()
2. GetHashCode()
Wykorzystuje zmienną każdego anonimowego typu do obliczenia wartości skrótu jako wpisu typu System.Collections.Generic.EqualityComparer i <T>generuje tę samą wartość skrótu tylko wtedy, gdy oba anonimowe typy mają te same właściwości i przypisana jest ta sama wartość.
4. Równa semantyka anonimowych typów
Równa się()
Przeanalizuj wyniki:
1. Equals(): Kompilator nadpisuje Equals(), aby ustalić, że obiekty są równe na podstawie semantyki wartości (np. notuje wartość każdego członka danych dwóch obiektów)
2. == Operatory: Ponieważ typy anonimowe nie przeciążają równoważnych operatorów (== , !=), == porównuje odwołania, a nie treść.
3. GetType(): Ponieważ jeśli zadeklarujemy dwa identyczne (z tymi samymi atrybutami) anonimowe typy w tym samym asemblerze, kompilator wygeneruje tylko definicję jednego anonimowego typu.
5. Typy anonimowe zawierające typy anonimowe
Streszczenie:
W rzeczywistości powinniśmy być ostrożni przy używaniu typów anonimowych, zwłaszcza przy użyciu LINQ, i nigdy nie rezygnować z używania silnie typowanych klas lub struktur z powodu pojawienia się typów anonimowych.
W rzeczywistości sam typ anonimowy ma wiele ograniczeń:
- Nie kontrolujesz nazwiska anonimowego typu
- Typy anonimowe dziedziczą System.Object
- Anonimowe typy pól i atrybutów są zawsze tylko do odczytu
- Anonimowe typy nie obsługują zdarzeń, niestandardowych metod, operatorów niestandardowych ani niestandardowych przepisywań
- Typy anonimowe są ukryte w tajemnicy
- Tworzenie jednostek anonimowych używa wyłącznie domyślnego konstruktora
Jeśli musimy szybko zdefiniować kształt jednostki bez definiowania jej funkcji, możemy użyć anonimowego typu. |