Operador ternario en c# y vb…y ??

11 10 2007

Algo creo que muy util de C# y que no existía en VB es el operador ternario, bueno en VB existe el IIf, pero hay una gran diferencia. Veamos:

En C#, la manera de utilizar el operador ternario es la siguiente

result = condición_lógica ? valor_si_verdadero : valor_si_falso;

Por ej.:

Int32 mayor = (a > b) ? a : b;

(los paréntesis no son necesarios, solo para legibilidad)

En este ejemplo clásico para devolver el mayor valor, si la condición lógica es verdadera ‘mayor’ valdrá a, caso contrario se le asignará b.

Ahora, que pasa si quiero utilizar el operador ‘?’ para lo siguiente:

String _usuario = (usuario != null) ? usuario : "invitado";

Bien, funciona, pero aquí puedo utilizar el operador ?? de C#, (o null coalescing operator) y obtener el mismo resultado con esta sentecia:

String _usuario = usuario ?? "invitado";

Este operador retorna el operando de la izquierda excepto cuando es nulo, donde retorna el de la derecha ‘invitado’ (ojo, no sirve para una cadena vacía, solo null)

Operador ternario en VB

A priori parecería que se puede utilizar el método IIf en VB como operador ternario, volviendo al primer ejemplo algo así como:

Dim mayor as Int32 = IIf(a > b, a, b)

¿funciona igual esto? sssNO. IIf es una función, por lo tanto retorna un tipo, ¿cual? Object. Y ahí se acabaron para mi todas la razones para utilizar IIf, ya que para no tener problemas y evitar casteos implicitos (una de las ‘licencias’ de VB que se aleja de la buena programación) tendríamos que convertir (CInt, CType…) el resultado antes de asignarlo a ‘mayor’.

Para colmo de males, como IIf es un método, todos los parámetros que se le pasan son evaluados previamente a la ejecución, por lo que se determinará el valor los dos posibles resultados sin importar cual sea el que retorne, más graficamente:

IIf(true, EstoSeEjecuta(), EstoYoNoQuisieraPeroSeEjecutaIgual())

Curioso: Si pasamos el código de C# a VB utilizando Reflector el operador ternario se refleja como IIf. Definitivamente Lutz sabe más que yo, pero creo que es una cuestión de legibilidad más que de exactitud.

En la MSDN David M. Kean propone hacer una función genérica, pero ¿que gracia tiene hacer una función, hacerla pública a todo el ámbito de nuetro código y sobre todo complicar la legibilidad del mismo que es la principal función del operador ternario, si no la única?

Todo esto hasta VB 8, en VB 9 tendremos la posibilidad de utilizar el operador ternario:

Dim mayor as Int32 = If(a > b ? a, b)

Tal vez se salga un poco de la clásica sintaxis de VB pero bienvenido sea.

En VB 9 (Agregado 11/2008): ¡Cuidado! Al ser el nuevo If de VB 9 un operador, ya no se calcula el valor de la expresión que no se retorna:

If(true, EstoSeEjecuta(), EstoNoSeEjecuta())

Pero de todas maneras el operador ¡Sigue retornando Object! y por lo tanto desaconsejo el uso del mismo para evitar boxing, casteos y demas temas.

Tambien hay que destacar que se agregó el null coalescing operator (o ??) de C#, con la siguiente sintaxis:

If(usuario, "Invitado")

Operador ternario y desempeño

En pruebas con Stopwatch, el desempeño es el mismo en ambos modos, no hay diferencia. A nivel IL el If genera más líneas, pero no redundan en el tiempo de ejecución.

Operador ternario y buenas prácticas de codificación

Acabo de leer por ahí a alguien jactandose de:

WriteLine("Login "+((condicion_booleana)?"":"in")+"válido.");

No estaré yo para competir en TopCoders, pero esto es lo que se llama algo muy muy poco recomendable, no pasa por el operador ternario el problema, si no por el hecho de querer ahorrar código haciendo malabares que después otro tendrá que entender. Esto es pereza no eficiencia.

Por último. En más de un documento donde se habla de buenas prácticas de codificación, recomiendan no usar el operador ternario, ¿por que?, bueno entiendo que lo que persiguen quienes hacen esta recomendación es código legible, pero lo que está mal es el abuso del operador, no su uso normal. Por ejemplo no es legible la sentecia:

cena = estoyPaNioquis ? HacerNioquis(harina, agua, huevos, pure):

PedirPizza(4866-2804,'Napo');

Cuando una línea excede la pantalla, ¿partimos la sentencia con el operador ternario en varias líneas? No. utilizamos If. Nuevamente la ventaja de este operador es unicamente la legibilidad del código, si no, no tiene gracia.

False: Me voy a comer pizza.

Anuncios

Acciones

Information

7 responses

4 09 2008
Elias A. Monroy Cruz

Gracias por el aporte. Lo has explicado muy bien y das a entender tu punto de vista con buenos argumentos.
Precisamente buscaba en la red algo bastante parecido a lo tuyo ya que la mayoria de los manuales (al menos los que he visto) no mencionan este tema.
Ojalá y aportes un poco con lo que son Patrones de Diseño de POO. Ese es una metodología de programación muy buena, pero de la que no he encontrado demasiada ayuda en todos los casos.

4 09 2008
Alejandro Hernández

Elias: Gracias, por el comentario.

El tema de patrones es muy interesante. Hay que tener en cuenta que no son una metodología de programación, simplemente cada patrón es una solución práctica y probada para un problema en particular.

Coincido en que es muy dificil encontrar documentación de patrones con ejemplos prácticos y es muy común leer explicaciones abstractas que son dificiles de digerir, personalmente tiendo a olvidar rápidamente cualquier técnica a la que no le encuentro aplicación.

Si bien tengo idea desde hace rato de escribir una serie de artículos sobre el tema, por ahora esta muy verde el tema.

¡Saludos!

24 07 2009
Yoguer

Interesante artículo, cólo un aporte
la forma del ternario en vb9 es
If(a > b, a, b)

28 07 2010
kalimansurf

Es muy buena la forma en que presentaste el caso, es la información que estaba buscando.

Saludos

8 04 2011
yelinna

¿es muy malo jugar así con los RadioButtons?
opcion = opUnLogo.Checked && opTHorizontal.Checked ? (byte)2 :
opUnLogo.Checked && opTVertical.Checked ? (byte)3 :
opDosLogos.Checked && opTHorizontal.Checked ? (byte)4 :
opDosLogos.Checked && opTVertical.Checked ? (byte)5 : (byte)6;

¿se me fue la mano?

9 06 2011
Cuauhtémoc

Disculpen mi ignorancia, pero tengo una pregunta, que es mas rápido usar un operador ternario, o el uso de if y else? o es depreciable este tiempo?

Saludos!!! 😀

5 10 2014
Jquery Grid

Jquery Grid

Operador ternario en c# y vb…y ?? | VarioNet

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: