2011-11-05 17 views
15

1) Ho letto alcuni snippet di codice (generale) e ho visto alcuni posti che utilizzavano IList<T> e alcuni utilizzavano IEnumerable. Qual è il vantaggio di utilizzare il primo su quest'ultimo?Perché utilizzare IList su IEnumerable?

2) is e as in C#. Capisco is fa il controllo del tipo e as esegue il casting. Ma cos'è esattamente il casting? forzare i dati su un oggetto di dimensioni? quando is e as differiscono?

risposta

29

Un IList[<T>] rappresenta qualcosa che:

  • può essere iterata
  • è di finita, dimensioni note
  • è ripetibile
  • si può accedere in modo casuale da indice
  • può (opzionalmente , controllabile) da modificare: riassegnare valori, aggiungere, rimuovere, ecc.

Un IEnumerable, d'altra parte, può essere solo iterato. Non tutte le cose che possono essere ripetute sono elenchi. Ad esempio:

static IEnumerable<int> Get() { 
    Random rand = new Random(); 
    while(true) yield return rand.Next(); 
} 

che ^^^ è una sequenza infinita. Non ha la lunghezza, non può essere mutata, non è possibile accedere in base all'indice ... tuttavia, può essere iterato:

foreach(int i in Get().Take(200)) { 
    Console.WriteLine(i); 
} 

is esegue un controllo di tipo che restituisce true/false ... cioè èobj un IList? si o no.

as esegue un controllo del tipo "prova a farlo"; restituisce null se non riesce o un riferimento digitato (ecc.) se ha esito positivo. Fondamentalmente, è una cosa efficienza:

if(obj is IList) { 
    var list = (IList) obj; 
    ... 
} 

è meno efficiente rispetto:

var list = obj as IList; 
if(list != null) { 
    ... 
} 

essi si comportano in modo diverso se obj è nulla; is genera un'eccezione; as restituisce null.

+1

Hai effettivamente misurato le prestazioni di quei due? L'istruzione IL è anche se i nomi suggeriscono che corrisponde a corrisponde effettivamente all'operazione. Non c'è operazione in IL. In realtà è in IL è 'obj as type! = Null' http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is-is. aspx. Quindi la scelta dovrebbe essere sulla leggibilità, direi –

+1

@RuneFS I codice regolarmente in IL, quindi sono molto consapevole di ciò. La differenza, tuttavia, è il cast cast extra ** dopo ** l'isinst. È, lo ammetto, una piccola differenza. –

+0

Penso che il compilatore JIT dovrebbe essere in grado di ottimizzare quel classcast. Ma non so se lo fa attualmente. – CodesInChaos

3
  1. IList offre determinati metodi che non lo fa IEnumerable. La cosa più importante è la possibilità di aggiungerlo (per ulteriori informazioni, controlla il msdn)
  2. is confronta i tipi, restituendo se un determinato oggetto può essere convertito in un tipo. as esegue effettivamente quella trasmissione, restituendo null se non è riuscita. Casting significa convertire un oggetto di tipo A in un oggetto di tipo B, per qualsiasi motivo.
+1

La maggior parte delle volte, in C#, il casting non converte gli oggetti tra i tipi. Solitamente, controlla solo se un oggetto è di un determinato tipo in fase di compilazione in fase di esecuzione, e in tal caso consente di assegnare l'oggetto a una variabile di tale tipo. (In caso contrario, restituisce 'null' o genera un'eccezione, a seconda che si utilizzi parens o' as'.) – millimoose

+0

In effetti, più comunemente si riferisce alla coercizione, non alla conversione –

Problemi correlati