C #: differenza tra List < T > e Collezione < T > (CA1002, Non esporre elenchi generici) [duplicato]

StackOverflow https://stackoverflow.com/questions/1232108

  •  22-07-2019
  •  | 
  •  

Domanda

    

Questa domanda ha già una risposta qui:

         

Ho provato a eseguire Run Code Analysis su un progetto qui e ho ricevuto una serie di avvisi che dicevano qualcosa del genere:

  

CA1002: Microsoft.Design: modifica "Elenco < SomeType > ' in " SomeClass.SomeProtectedOrPublicProperty " per utilizzare Collection, ReadOnlyCollection o KeyedCollection

Perché dovrei usare Collection < T > invece di List < T > ? Quando guardo la documentazione di msdn, sembrano quasi uguali. Dopo aver letto la guida dell'errore per l'avviso, l'ho trovato

  

System.Collections.Generic.List (T) _è una raccolta generica progettata per prestazioni non ereditarie e, pertanto, non contiene membri virtuali.

Ma cosa significa veramente? E cosa dovrei fare invece?

Dovrei continuare a usare Elenco < T > internamente, quindi nelle proprietà restituire invece un nuova collezione < T > (someList) ? O dovrei semplicemente iniziare a usare Collection < T > invece di List < T > ?

È stato utile?

Soluzione

In breve, l'elenco generico non ha metodi virtuali per Aggiungi, Rimuovi ecc., poiché è stato progettato per essere veloce, non estensibile. Ciò significa che non è possibile scambiare questa implementazione concreta con una sottoclasse utile (anche se è possibile sottoclassarla in quanto non sigillata).

Pertanto, esponendo l'Elenco stesso, non è mai possibile estendere la propria raccolta per tenere traccia delle operazioni di aggiunta o rimozione (ad esempio) senza interrompere il contratto pubblico della classe.

Esponendo la tua raccolta come IList o qualcos'altro, puoi comunque utilizzare l'Elenco come back-store effettivo, ma mantieni la futura estensibilità in quanto puoi scambiare l'implementazione concerete in un secondo momento senza modificare il contratto pubblico della tua classe .

Altri suggerimenti

Collection espone alcuni membri virtuali (inserisci, rimuovi, imposta, cancella) che puoi sovrascrivere e fornire funzionalità aggiuntive (come eventi di notifica) quando la raccolta viene modificata.

Potresti non averne bisogno ora, ma è un requisito comune per le classi che contengono raccolte, quindi è meglio pianificarlo in anticipo. Poiché Collection è progettato pensando all'estensibilità, è molto flessibile. Se in futuro deciderai di aver bisogno di alcune funzionalità extra nella raccolta, puoi semplicemente estenderlo senza alcuna modifica all'interfaccia pubblica della classe. Se avessi usato un elenco, avresti dovuto cambiarlo in un insieme, il che significa che avrebbe rotto tutti i chiamanti della tua classe perché avrebbero dovuto essere cambiati per usare gli elenchi.

List invece è progettato tenendo conto delle prestazioni, quindi dovrebbe essere usato solo in casi specifici in cui le prestazioni sono molto importanti. Perché non è estendibile future modifiche a qualsiasi cosa che utilizza un elenco interromperà qualsiasi altra cosa dipendente da esso. Normalmente List dovrebbe essere usato solo all'interno di classi di livello molto basso e non esposto a nulla per ridurre la possibilità di future modifiche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top