2010-03-14 14 views
6

¿Qué es una forma elegante de escribir esto?Cheque elegante para nulo y salida en C#

changeColor() es una función nula y la función que ejecuta el código anterior es una función void así.

+0

Además, nada como esto, si hay una posibilidad de que lastSelection podría cambiar, debe almacenar la valor actual en un local, o usar un patrón de objeto nulo por mi respuesta. De lo contrario, todavía está arriesgando una excepción de ref null si lastSelection cambia entre 'si' y cuándo lo usa. – kyoryu

Respuesta

14

puede reducir el desorden mediante la inversión de la condición:.

if (lastSelection == null) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 
+0

¡Ja! Bueno, obviamente +1 :) – overslacked

9

Aunque personalmente realmente no les gusta tener múltiples sentencias de retorno de una función, de acuerdo con la programación defensiva que he visto, que había trampa de la condición de error y salida, y dejar todo lo demás a través de:

if(lastSelection == null) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 

es difícil decir cómo me gustaría hacer esto en mi propio trabajo sin ver toda la función de esto pertenece en

+0

:-) Dos mentes que ingresan a la misma solución al mismo tiempo. Sin embargo, el tuyo tiene más comentarios. – Bevan

2

Tendría la tentación de asegurarme de que lastSelection nunca fue nulo, y hacer que apunte a un objeto "vacío" en los casos en que sería nulo en el diseño actual. Entonces, no hay necesidad de un cheque nulo. La ingeniería de posibles errores fuera del sistema siempre es una buena práctica.

OIA, me gustaría preguntar si la falta de elegancia en el código es como se hace el cheque nulo, o si se trata de el hecho de que se requiere un cheque nulo en absoluto.

+0

Es posible que no se requiera una verificación "nula", pero este parece ser el código UI, y sería bueno decirle al usuario "Sin selección realizada" si no se ha realizado ninguna selección. En ese caso, incluso utilizando el Patrón de Objeto Nulo, sería necesario verificar el objeto nulo para decirle al usuario. –

+2

@ John Saunders: Y luego preguntaría por qué la opción de cambiar el color incluso existía si no era una acción viable; en ese caso, preferiría bloquear la acción deshabilitando el control/lo que sea antes de que llegue siquiera a este códigoAlternativamente, el objeto nulo podría desencadenar el cuadro de mensaje para aparecer, directa o indirectamente (por ejemplo, a través de un evento en el objeto conectado al código en la interfaz de usuario que muestra el cuadro, para mantener el objeto nulo ignorante de los detalles de la UI). – kyoryu

+0

@ John Saunders: (Por cierto, puede ser que no haya una opción viable para evitar el cheque nulo, pero ciertamente trataría de ver si había alguno). – kyoryu

0

Creo que su código es bueno: primero verificó el caso normal (lastSelection != null) para el caso anormal.

que sólo puede añadir una sola modificación:

if (lastSelection != null) 
{ 
    lastSelection.changeColor(); 
    //your other normal code 
} 
else 
{ 
    MessageBox.Show("No Selection Made"); 
    //return; //no need for this now 
} 
+1

@Sameh: su sugerencia funciona si ese es todo el código que hay en el método. Pero, ¿cómo lo harías si hubiera 10 copias del mismo código, quizás con cada una revisando una variable diferente para null? –

+0

@John: este es un buen punto, pero su problema parece lo suficientemente simple como para decir lo que he dicho. –

+0

@Sameh: me pareció que no nos mostró todo su código, y que el código que mostró no era el único en el método. Podría estar equivocado acerca de eso. –

1

Al ver a todos los demás dieron las buenas respuestas, no hace esto:

if (lastSelection == null) goto ERR; 
lastSelection.changeColor(); 
//... possibly more stuff... 
return; 
ERR: 
MessageBox.Show("No Selection Made"); 
+1

Heh. Este es un buen consejo. Para que quede claro, cuando dije que no me gustaban las declaraciones de devolución múltiples, ¡no tenía la intención de abogar por los gotos de ninguna manera! – overslacked

0

Una práctica avanza a pasos agigantados es escribir null primero como a continuación:


if (null == lastSelection) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 
 
+5

@pokrate: "ponerse al día rápidamente"? Hombre, eso es un artefacto de la época de C, cuando el compilador no le advertía sobre hacer 'if (lastSelection = null)'. ¡Eso tiene casi dos décadas! –

+0

@pokrate, en caso de que no lo supiera, en realidad obtendrá un * error de compilador * si intenta asignar una sola variable en un if in C#. Estoy tan triste de que este tipo de construcciones se pierda ... – overslacked

+0

Esa es una nueva práctica, la he visto en casi todos los kits de inicio de asp.net y aquí en StackOverflow. Y estoy usando VS2008 y no puedo ver ninguna advertencia de compilación también. – pokrate

1

Esto es aún otra forma de implementar esto.

 Action _action = (lastSelection != null 
           ? 
            new Action(lastSelection.changeColor) 
           : 
           () => Console.WriteLine("No Selection Made")); 
     _action.Invoke(); 

Tal vez un poco exagerado, pero que sin duda tendrá la gente mantener su código rascándose la cabeza :-)

+0

Leer este código me provocó picazón, pero el picor no estaba en mi cabeza :) – BillW

+1

Este código es muy inteligente. Espera, algo está mal ... estaba * seguro * que inteligente era una palabra de cuatro letras ... – kyoryu

Cuestiones relacionadas