Se si dispone di una lista in cui ho è un'interfaccia e si aggiungono elementi di tipo F1 e F2 dove entrambi implementano l'interfaccia ho, poi quando si recupera una delle due elementi dalla Lista puoi verificare il tipo di riferimento usando la parola chiave ** è ** e procedi ad applicare il cast corretto all'elemento che hai ottenuto dall'elenco.
Ad esempio:
struct Foo1 : IFoo {...}
struct Foo2 : IFoo {...}
List<IFoo> listOfFoo = new List<IFoo>();
IFoo foo1 = new Foo1();
IFoo foo2 = new Foo2();
listOfFoo.Add(foo1);
listOfFoo.Add(foo2);
// lets retrieve the first element and check if it's a Foo1 value type
if(listOfFoo[0] is Foo1){
// cast element from List to Foo1
Foo1 foo = (Foo1) listOfFoo[0];
}
Dal momento che abbiamo a che fare con le strutture, quando l'elemento della lista viene colato indietro al tipo di valore originale, si dovrebbe essere unboxed. Ma troppi unboxing e boxing possono colpire le prestazioni e dal momento che si desidera eseguire qualcosa come il rilevamento delle collisioni, ciò potrebbe comportare prestazioni ridotte.
È obbligatorio per l'utente utilizzare le strutture? A causa delle modifiche apportate alle variabili di boxing, le variabili potrebbero non funzionare correttamente se si eseguono operazioni sugli oggetti box memorizzati e, come ho già detto, troppa boxe potrebbe portare a risultati scadenti.
A mio parere una classe con MemberwiseClone sarebbe meglio.
È possibile leggere l'articolo this su MSDN che descrive i pro e i contro di entrambe le strutture e le classi, questo potrebbe aiutare a capire meglio quando utilizzare l'uno o l'altro.
fonte
2015-02-12 17:52:12
Una domanda di riferimento: http://stackoverflow.com/questions/63671/is-it-safe-for-struct-to-implement-interfaces?rq=1 .. E vorrei suggerire di andare con approccio di classe . –