Quando non vogliamo definire classi complesse come metodi complessi, eventi e costruttori, possiamo generare dinamicamente un tipo di dato personalizzato -> tipo anonimo.
1. Definire il tipo di anonimato
Quando si definisce un tipo anonimo, è necessario utilizzare la parola chiave var e la sintassi di inizializzazione degli oggetti.
var: Il compilatore genera automaticamente una nuova definizione di classe in tempo di compilazione (non possiamo vedere il nome della classe nel codice C#).
Inizializzazione: Indicherà al compilatore di creare campi di background privati e proprietà (di sola lettura) per il tipo appena creato.
Costruisci un tipo anonimo passando i parametri e stampando le informazioni rilevanti
Chiamata: I tipi anonimi possono anche essere costruiti usando hardcode
2. Rappresentazione interna di tipi anonimi
Tutti i tipi anonimi ereditano automaticamente da Object, quindi possiamo usare ToString, GetHashCode, Equals sull'oggetto car, proviamo a chiamare questo:
Chiamate e risultati:
Il tipo dell'oggetto auto è: <>f__AnonymousType03 (il tuo potrebbe essere diverso), il nome anonimo del tipo è percepito dal compilatore, non possiamo interferire, codice CIL.
3. Implementazione dei metodi ToString() e GetHashCode().
1.ToString()
2.GetHashCode()
Utilizza la variabile di ciascun tipo anonimo per calcolare il valore hash come input di tipo di System.Collections.Generic.EqualityComparer, e <T>produce lo stesso valore hash solo se i due tipi anonimi hanno le stesse proprietà e ricevono lo stesso valore.
4. Semantica uguale dei tipi anonimi
Uguali()
Analizza i risultati:
1. Equals(): Il compilatore sovrascrive Equals() per determinare che gli oggetti sono uguali basandosi sulla semantica dei valori (ad esempio, annota il valore di ogni membro dati di due oggetti)
2. == Operatori: Poiché i tipi anonimi non sovraccaricano gli operatori equivalenti (== , !=), == confronta i riferimenti, non il contenuto.
3. GetType(): Perché se dichiariamo due tipi anonimi identici (con gli stessi attributi) nello stesso assembly, il compilatore genererà una definizione di un solo tipo anonimo.
5. Tipi anonimi che contengono tipi anonimi
Sommario:
Anzi, dovremmo essere cauti nell'usare tipi anonimi, specialmente quando si usa LINQ, e non rinunciare mai all'uso di classi o strutture fortemente tipate a causa dell'emergere di tipi anonimi.
In effetti, il tipo anonimo stesso presenta molte limitazioni:
- Non controlli il nome del tipo anonimo
- I tipi anonimi ereditano System.Object
- I tipi anonimi di campi e attributi sono sempre di sola lettura
- I tipi anonimi non supportano eventi, metodi personalizzati, operatori personalizzati e riscritture personalizzate
- I tipi anonimi sono implicitamente sigillati
- La creazione di entità di tipi anonimi utilizza solo il costruttore predefinito
Se dobbiamo definire rapidamente la forma di un'entità senza definirne la funzione, possiamo usare il tipo anonimo. |