2009-11-02 23 views
6

¿Cuáles son los patrones de uso comunes y no tan comunes para la clave C# 'es'. Recientemente lo usé para contar el número de celdas usadas en una matriz tipada, (todavía atascado en la parte inferior con clases generadas xsd, ya que xsd2code tenía varios problemas con el esquema diseñado por IETF, por lo tanto, no había genéricos).C# Patrones de uso para la palabra clave "es"

Qué otros patrones de uso comunes y más importantes se ofrecen.

+1

Creo que el patrón más común es el utilizado para lo que hace ...(el resto es bastante raro), como en A es B o A implementa B. –

Respuesta

14

La palabra clave 'es' es útil para determinar si un objeto es convertible a un tipo a través de una conversión de referencia, boxeo o desembalaje (especificación de langitud C# 7.9.10). Es similar a 'como' excepto que en realidad no hace la conversión, simplemente regresa si es posible.

Es útil en cualquier escenario donde saber si un objeto es convertible a un tipo es útil pero no es necesario tener el objeto a través de una referencia a ese tipo.

if (o is SomeType) { 
    TakeSomeAction(); 
} 

Si tener una referencia del tipo especificado en el valor es útil entonces es más eficaz utilizar el 'como' operador en su lugar.

// Wrong 
if (o is SomeType) { 
    SomeType st = (SomeType)o; 
    st.TakeSomeAction(); 
} 

// Right 
SomeType st = o as SomeType; 
if (st != null) { 
    st.TakeSomeAction(); 
} 
6

En realidad, casi nunca lo uso. Cuando lo necesito, generalmente es porque voy a convertir el valor al tipo requerido de todos modos, por lo que prefiero usarlo como alternativa.

comparación:

if (x is MyType) 
{ 
    MyType y = (MyType)x; 
    ... 
} 

Y:

MyType y = x as MyType; 
if (y != null) 
{ 
    ... 
} 

En el primer caso: 2 operaciones (1 tipo de comprobación + 1 CAST)

En el segundo caso: 1 operación (tipo check + cast de una vez)

+0

Si mi memoria me sirve Bueno, el código il emitido es básicamente el mismo –

+1

Acabo de consultar con Reflector, no es ... De todos modos, no lo haría tiene sentido, ya que estos dos enfoques son semánticamente diferentes (por ejemplo, 'as' solo se puede usar con tipos de referencia) –

1

No recuerdo haber usado alguna vez is. La mayoría de las veces, si necesita saber si una instancia es de cierto tipo, debe usarla como tal.

Por lo tanto, normalmente lo echo directamente usando as o fundición explícita si estoy seguro de que en realidad es del tipo en cuestión.

Intento escribir código que no necesita convertir o buscar información de tipo más de una vez. Por lo tanto, escribir is antes de un molde de un tipo de referencia ciertamente no es recomendable.

+0

" es "antes de un molde es la única forma de lanzar" objetos "de forma segura a tipos de valores como" como "quiere ser capaz de devolver un valor nulo, que no es compatible con los tipos de valores. –

+0

@Hans: sí, tienes razón, lo reformulo para que sea específico para los tipos de referencia. –

0

Con el próximo v4 en lugar de utilizar es y como hay un enfoque diferente posible.

void somemethod(dynamic o) 
{ 
DoStuff(o); 
} 

DoStuff(neededType o){} 
DoStuff(object o){} 

que sin embargo podría tener un impacto performnce pero lo hace para buena legibilidad

0

Depende si usted necesita una referencia al tipo si is un tipo del tipo dado. Si es así, deberías usar `como keyworkd.

MyObject mo = obj as MyObject; 
if (mo == null) { 
    // do something. 
} else { 
    // do something else. 
} 

que daría como resultado una referencia que puede probar para nulo. De lo contrario, utilizando el as oprator terminará siendo necesario para realizar un cast de todos modos.

Cuestiones relacionadas