s' marc_s è un po' viziato , Vedo questo codice tutto il tempo quindi voglio sottolineare l'importanza della differenza tra questi operatori. is
è un test booleano per determinare se un oggetto è assegnabile a un determinato tipo. as
controlla se un oggetto è assegnabile a un determinato tipo e, in caso affermativo, restituisce quell'oggetto come tale tipo, in caso contrario restituisce null. risposta marc_s s' è davvero facendo questo
foreach(Control c in form.Controls)
{
if(c is Textbox)
HandleTextbox(c is Textbox ? (Textbox)c : null);
if(c is Listbox)
HandleListbox(c is Listbox ? (Listbox)c : null);
}
È superfluo utilizzare is
con as
. Quando usi mai as
sostituiscilo con l'espressione sopra, è equivalente. Utilizzare is
con calchi diretti ()
o as
solo da se stessa. Un modo migliore per scrivere quell'esempio sarebbe.
foreach(Control c in form.Controls)
{
if(c is Textbox)
HandleTextbox((Textbox)c);
//c is always guaranteed to be a Textbox here because of is
if(c is Listbox)
HandleListbox((Listbox)c);
//c is always guaranteed to be a Listbox here because of is
}
O se vi piace veramente as
foreach(Control c in form.Controls)
{
var textBox = c as Textbox;
if(textBox != null)
{
HandleTextbox(textBox);
continue;
}
var listBox = c as ListBox
if(listBox != null)
HandleListbox(listBox);
}
Un esempio reale mondo che mi imbatto in tutto il tempo sta ottenendo gli oggetti da una zona di stoccaggio che restituiscono solo tipo di oggetto. Il caching è un ottimo esempio.
Person p;
if (Cache[key] is Person)
p = (Person)Cache[key];
else
p = new Person();
io uso as
molto meno nel codice vero e proprio perché funziona davvero solo per i tipi di riferimento. Si consideri il seguente codice
int x = o as int;
if (x != null)
???
as
fallisce perché un int non può essere nulla. is
funziona bene anche se
int x;
if (o is int)
x = (int)o;
Sono sicuro che ci sia anche una certa differenza di velocità tra questi operatori, ma per una vera e propria applicazione la differenza è trascurabile.
Il vantaggio principale di "come" è che non sarà un'eccezione quando cast è valido. Cast diretto tipo sarebbe. –
Dipende dal significato di come è. ;) – kenny
Vedere anche "Quando utilizzare le informazioni sul tipo di runtime?" a http://stackoverflow.com/questions/1520466 – ChrisW