Pregunta

Constantemente me encuentro escribiendo un código similar como el siguiente ejemplo:

if (object["Object Name"] != null) {
    if (object["Object Name"] == "Some Value") {
        // Do Statement A
    } else {
        // Do Statement B
    }
} else {
    // Do Statement B
}

El problema aquí es que compruebo mucho si un objeto es nulo o no, y luego puedo verificar su contenido real.

" Declaración B " es siempre el mismo y en mi caso suele ser una declaración SQL.

¿Debe haber una mejor manera de evitar esto?

Gracias
Stephen

¿Fue útil?

Solución

Hay cortocircuitos en C #, por lo que puedes hacer:

if(null != object && object.name == foo)
  do A
else
  do B

C # siempre evalúa la primera expresión en la declaración condicional y, si eso falla, no intenta nada más en esa parte de la declaración.

Para profundizar en este punto, si va a tener una operación costosa en la declaración condicional junto con una o más operaciones de bajo costo, es bueno ponerlo al final si es posible, por lo que solo revisará la operación costosa cuando realmente necesita Así que algo como

if(trivial comparison && trivial comparison && REALLY EXPENSIVE OPERATION)

Ahora solo ejecutará la operación costosa como último recurso.

Otros consejos

Ya que C # hace cortocircuito, sí. Prueba esto:

if (object["Object Name"] != null && object["Object Name"] == "Some Value") 
{
    // Do Statement A
} 
else 
{
    // Do Statement B
}

Creo que reescribir el if-then-else a esto hará que se vea mejor debido a la única declaración B.

if ((object["Object Name"] != null) && (object["Object Name"] == "Some Value")) 
{
    // Do Statement A
} 
else 
{
    // Do Statement B
}

¿Por qué el doble control? Seguramente esto sería suficiente:

if(object["Object Name"] == "Some Value") {
    // Do statement A
} else {
    // Do statement B
}

Veo a lo que te refieres con la comprobación de nulos, pero el ejemplo particular que das no lo requiere.

EDITAR: Ahora, si ha escrito esto en su lugar:

if (object != null) {
    if (object["Object Name"] == "Some Value") {
        // Do Statement A
    } else {
        // Do Statement B
    }
} else {
    // Do Statement B
}

entonces la solución sería:

if(object != null && object["Object Name"] == "Some Value") {
    // Do Statement A
} else {
    // Do Statement B
}

RENUNCIA DE RESPONSABILIDAD: no hacer el método general de cortocircuito.

Bueno, podría crear una función separada para realizar la búsqueda, especialmente si la consulta sigue siendo la misma. Así que algo como esto: (pseudocódigo de entrada)

private bool IsNullCheck(string objectName)
{
  if (object["Object Name"] != null)
     return false;
  else
     // statement B
}

if (!IsNullCheck("Object Name") && if(object["Object name"] == "Value") {
   // stuffs

} 
else 
{
        // Do Statement B
}

O similar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top