Doble si el problema es otro en C #
-
06-07-2019 - |
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
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.