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
.
fonte
2011-11-05 23:00:13
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 –
@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. –
Penso che il compilatore JIT dovrebbe essere in grado di ottimizzare quel classcast. Ma non so se lo fa attualmente. – CodesInChaos