2010-05-20 11 views
5

Por ejemplo. Digamos que tenemos un stackpanel en un formulario. Está lleno de Grids y Labels. Quiero recorrer todas las Grids y hacer alguna operación con ellas, pero dejo intactas las Lables. Por el momento lo estoy haciendo de esta manera.Usando "como" y esperando un resultado nulo

foreach(UIElement element in m_stacker.Children) 
{ 
    Grid block = element as Grid; 
    if(block != null) 
    { 
     //apply changes here 
    } 
} 

Así que estoy usando el hecho de que "como" devuelve nulo si no puede convertirse en el tipo requerido. ¿Es esto correcto o hay una mejor solución para este problema?

+7

En realidad, ese es probablemente el caso de uso más común para 'as'. –

+0

Gracias por toda la respuesta chicos. Me quedaré con "como" parece que es lo correcto para hacer. – DrLazer

Respuesta

2

Funcionará bien. Sin embargo, lo que puedes hacer es usar "es".

foreach(UIElement element in m_stacker.Children) 
{ 
    if(element is Grid) 
    { 
     //apply changes here 
    } 
} 
+1

Solo si no necesita acceder a las propiedades y métodos de 'Grid'. – ChrisF

+0

Es obvio que necesitas lanzarlo. :) – sovanesyan

13

¿Qué hay de OfType()?

foreach(var grid in m_stacker.Children.OfType<Grid>()) { ... } 

Este bucle sólo sobre los hijos de tipo rejilla , por lo que no hay necesidad de emitir o comprobar el tipo en absoluto.

+3

De hecho, 'OfType ()' está haciendo exactamente lo mismo internamente. ;-) – Oliver

+3

@Oliver: pero el código parece más legible y es más corto de esta manera. – tanascius

+1

'OfType' es una buena forma de filtrar elementos de un tipo en una colección. Sin embargo, si desea hacer cosas diferentes con diferentes objetos en una sola colección ('var g = o como Grid; if (g! = Null) {/ * hacer esto * /} else {var c = o como Canvas; (c! = null) {/ * hazlo * /}} '), tendrás que iterar la colección varias veces con' OfType' - y cuando tienes un solo objeto, en lugar de una colección, no es una elección. –

2

Si va a utilizar block como Grid, esta es la forma correcta de codificarlo.

Comprobación utilizando is (en mi opinión) produce código menos legible como se ilustra en los siguientes dos malas ejemplos:

if (element is Grid) 
{ 
    Grid block = element as Grid; 
    // Do stuff 
} 

if (element is Grid) 
{ 
    Grid block = (Grid)element; 
    // Do stuff 
} 

No hacer cualquiera de estas.

Usted está diciendo que si el elemento es una cuadrícula, entonces empújelo.

+0

Code Analysis recomienda que no haga lo que usted escribió. El mejor enfoque es utilizar el operador 'as' y verificar' null'. – abatishchev

+0

@abatishchev - De acuerdo. Estaba resaltando lo que ** no debes hacer. – ChrisF

+0

Estoy de acuerdo.Aunque no hay absolutamente nada de malo en usar 'es', creo que 'como' es definitivamente mejor en la mayoría de las situaciones. –

Cuestiones relacionadas