2012-01-01 5 views
6

Che differenza c'è tra questi tre modi di creare un nuovo List<string> in C#?Qual è la differenza tra questi tre modi di creare un nuovo elenco <string> in C#?

A = new List<string>(); 
B = new List<string> { }; 
C = new List<string>() { }; 
+0

() è la variabile {} inserisce i dati nella variabile Non sono sicuro che B compilerebbe? Ma A = C;) – craig1231

+0

Forse() è la variabile, ma che differenza fa, conta ancora = 0 –

+0

Tutti compila, infatti, ho appena trovato alcuni dei miei primi codici tutti come B, sento strano poi vengo qui chiedo questa domanda :) –

risposta

4

Questi sono equivalenti, tutti e tre creano uno List<string> vuoto.

  1. è un semplice costruttore senza parametri
  2. utilizza la sintassi raccolta di inizializzazione, in cui si è permesso di omettere le parentesi del costruttore se la classe fornisce un costruttore senza parametri
  3. lo stesso di 2., solo fornire le parentesi graffe facoltative del costruttore.

La sintassi di inizializzazione di raccolta consente di fornire i dati durante la creazione dell'oggetto,

List<string> list = new List<string> { "one", "two", "three" }; 

viene espanso a

List<string> list = new List<string>(); 
list.Add("one"); 
list.Add("two"); 
list.Add("three"); 

dal compilatore.

+2

Sintassi di inizializzazione dell'oggetto: 'new Foo() {Bar =" ciao ", Count = 2};' Sintassi di inizializzazione della raccolta: 'new List () {" one "," two "};' - so "sintassi di inizializzazione della raccolta" è il termine corretto nel tuo utilizzo. – Adam

+0

vero, corretto. – Femaref

4

Questi sono tutti identici. Non c'è differenza nel risultato finale, solo nella sintassi.

1

Nel tuo esempio, tutte e tre le istruzioni fanno lo stesso: creano una lista di stringhe vuota. Le istruzioni B e C possono assegnare alcuni dati iniziali all'elenco, ad es.

ingredients = new List<string> { "Milk", "Sugar", "Flour" }; 

Il () come nell'istruzione C può quindi essere omesso.

8

Non c'è differenza perché non si sta inizializzando nulla all'interno dell'elenco al momento della sua dichiarazione.

Se si dovesse aggiungere alcune stringhe a dichiarazione-tempo, si avrebbe bisogno di andare con la seconda o terza scelta:

var B = new List<string> { "some", "strings" }; 
var C = new List<string>() { "some", "strings" }; 

La terza opzione sarebbe solo necessario se si dovesse passare un valore in il List<of T> costruttore:

var C = new List<string>(5) { "some", "strings" }; 

o

var C = new List<string>(5); // empty list but capacity initialized with 5. 

ci sono mo re costruttori disponibili per la classe List<of T> (ad es. passare una raccolta esistente o IEnumerable nel costruttore List). Vedi MSDN per i dettagli.

+0

+1 - Bella spiegazione. –

1

{} viene utilizzato per la raccolta \ oggetto inizializzatore.
Se rimane vuoto, non fa nulla.

Quindi tutte quelle linee producono la stessa cosa.

1

Nell'esempio che ci hai fornito, il risultato sarà lo stesso.

In termini di prestazioni non si riscontrano problemi nell'utilizzare nessuna di queste opzioni per l'inizializzazione di una lista vuota, poiché l'IL generato genererà una ctor(), come si può vedere usando IL DASM.

Se si desidera inizializzare la lista con alcune informazioni, si può andare per l'opzione 2 o 3.

List<string> b = new List<string> { "abc", "abc" }; 
List<string> c = new List<string>() { "abc", "abc"}; 

In termini di prestazioni è anche la stessa, l'IL generato sarà esattamente lo stesso, contenente il ctor() e due Aggiungi per entrambi.

Ma dovresti usare il migliore da leggere. Per evitare qualsiasi problema di lettura del codice per voi colleghi, vorrei andare per

List<string> a = new List<string>(); 

Ma questa è una questione di opinione personale.

+0

Ero in uso la nuova lista {}, più simile a un oggetto per me. Ma ora inizio a utilizzare la nuova lista () {}, più chiara su ciò che sto facendo. –

Problemi correlati