marc_s 's es un poco defectuoso , Veo este código todo el tiempo, así que quiero enfatizar la importancia de la diferencia entre estos operadores. is
es una prueba booleana para determinar si un objeto es asignable a un tipo determinado. as
comprueba si un objeto es asignable a un tipo determinado y, si lo es, devuelve ese objeto como ese tipo; si no, devuelve nulo. respuesta marc_s 's realmente está haciendo este
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);
}
Es redundante utilizar is
con as
. Cuando utilice as
simplemente reemplácelo con la expresión anterior, es equivalente. Use is
con moldes directos ()
o as
solo. Una mejor forma de escribir ese ejemplo sería.
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 si te gusta mucho 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 ejemplo del mundo real que me encuentro con todo el tiempo es cada vez más objetos de un área de almacenamiento que sólo volver tipo de objeto. El almacenamiento en caché es un gran ejemplo.
Person p;
if (Cache[key] is Person)
p = (Person)Cache[key];
else
p = new Person();
utilizo as
mucho menos en código real, ya que realmente sólo funciona para los tipos de referencia. Considere el siguiente código
int x = o as int;
if (x != null)
???
as
falla debido a un int no puede ser nulo. is
funciona bien, aunque
int x;
if (o is int)
x = (int)o;
Estoy seguro de que hay también una cierta diferencia de velocidad entre estos operadores, pero para una aplicación real, la diferencia es insignificante.
La principal ventaja de "como" es que no arrojará una excepción cuando el lanzamiento no es válido. El tipo de transmisión directa lo haría. –
Depende del significado de lo que es. ;) – kenny
Consulte también "¿Cuándo utilizar información de tipo de tiempo de ejecución?" en http://stackoverflow.com/questions/1520466 – ChrisW