Domanda

Detto diversamente:

Esiste una buona ragione per scegliere una raccolta con tipizzazione approssimativa rispetto a una con tipo sicuro (HashTable vs.Dizionario)?Esistono ancora solo per compatibilità?

Per quanto ho capito, le raccolte generiche non solo sono indipendenti dai tipi, ma le loro prestazioni sono migliori.


Ecco un articolo completo sull'argomento: Un esame approfondito delle strutture dati utilizzando C# 2.0.

È stato utile?

Soluzione

Le raccolte non generiche sono così obsolete che sono state rimosse dal CoreCLR utilizzato in Silverlight e Live Mesh.

Altri suggerimenti

Esistono anche problemi con la visibilità COM: l'interoperabilità COM non può essere utilizzata con i generici

In futuro dovranno essere utilizzate solo raccolte generiche.C'è anche il vantaggio di evitare il boxing/unboxing dei tipi nella raccolta.Ciò è inefficace, soprattutto quando si dispone di una raccolta di tipi di valore che vengono convertiti in System.Object quando archiviati nella raccolta, quindi archiviando i valori nell'heap anziché nello stack di chiamate.

Per quanto riguarda l'utilizzo di raccolte non generiche per archiviare raccolte eterogenee di elementi, puoi sempre utilizzare List<object> per ottenere la stessa cosa.Solo per questo motivo, direi che non c'è quasi alcun motivo per toccare mai più le collezioni non generiche.

L'eccezione sarebbe quella di mantenere la compatibilità con sistemi scritti in altri linguaggi o con versioni precedenti del framework .NET, ma secondo me è un caso piuttosto "spigoloso".

Posso dirti che la serializzazione XAML delle raccolte si basa sull'implementazione di IList o IDictionary, quindi le raccolte non generiche rimarranno con noi per un po' di tempo a venire.

Non direi che sono obsoleti o che verranno rimossi a breve.È vero che dovresti evitare di utilizzare raccolte non generiche a meno che tu non abbia una ragione non non utilizzare una versione generica.Migliaia di righe di codice legacy (non così legacy) sono ancora in giro (e lo saranno per anni) che supportano raccolte non generiche come ArrayLists.Poiché questi erano i soltanto raccolte in .NET 1.0 e 1.1, è stato ampiamente utilizzato (e abusato) durante tutto l'anno.

Occasionalmente devo ancora interagire con un vecchio mapper O/R scritto in .NET 1.1 che restituisce oggetti IList.Ho un metodo che esegue la conversione in un elenco generico<>, che non è efficiente, ma è così.

E se hai bisogno di memorizzare oggetti diversi nello stesso array (strano ma possibile) tu Volere necessitano di una collezione non generica.La penalità di Boxing e Unboxing è qualcosa che dovrai comunque pagare.

Non aver paura di usarli se ritieni di doverlo fare.

Potrebbero esserci casi in cui è necessario archiviare oggetti di tipo sconosciuto o oggetti di più tipi diversi, ma se conosci effettivamente il tipo di oggetti che desideri archiviare, non vedo un motivo per non utilizzare la versione generica.

Modificare:Come commentato puoi semplicemente usare List<Object> - eh!

Sì, da quanto ho capito sono presenti solo per compatibilità con i prodotti esistenti.Dovresti sempre utilizzare la versione sicura (ad es.utilizzare System.Collections.Generic su System.Collections).

http://msdn.microsoft.com/en-us/library/ms379564.aspx

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