6 de marzo de 2012

Operador ternario en VS


El operador ternario ? en programación es una forma de hacer operaciones condicionales con 3 parámetros. La forma básica de aplicarlo es la siguiente:

expresión1 ? expresión2 : expresión3

Se evalúa la expresión1, y si su resultado es verdadero, entonces se evalúa y devielve como resultado la expresión2. Si expresión1 es falso, se evalúa y devuelve expresión3. En este caso, es equivalente a escribir:

if (expresión1) { expresión2; } else { expresión3; }

Otra forma de interpretar el orden de los factores sería:

condición ? valorSiEsVerdadero : valorSiEsFalso


Operador ternario en C#

aquí tal como indica el nombre es un operador, osea un simbolo que interpreta el compilador
string comparacion = a > b ? "a es mayor que b" : "a es menor o igual que b";

Null Coalescing Operator (??) en C#

Imaginemos tenemos esta asignacion en C#, declaro una variable tipo string llamada nombre y luego este valor se lo asigno a otro variable tipo string llamada aka, si el nombre es vacío se asigna el valor aka de Sr y en caso no sea vacío se le asigna a la variable aka el valor de nombre

string nombre = Juan;
string aka = (nombre==null)?Sr:nombre;

Bien, C# nos ofrece el operador ?? que hace exactamente lo mismo que lo anterior y tiene las virtudes de ser conciso y a la vez legible, en caso de no ser nulo se asigna el valor de nombre a aka, en caso de ser nulo se asigna Sr.

string nombre = Juan;
string aka = nombre??Sr;


pero seguir viendo la utilidad, ahora imaginemos una funcion que en caso de que el resultado de calculando() sea null, retornará cero pero en caso contrario retornara el valor que la funcion trabajó

return (calculando() == null) ? 0 : calculando();


El problema es que evaluaria y ejecutaria dos veces la funcion calculando(), pero ahora con el ?? solo lo haria una vez, con el correspondiente ahorro de proceso en todas las lineas de codigo donde se evalue que una expresion es null y las sustituyamos por:


return claculando() ?? 0;



Ahora un ejemplo que ilustra el uso del IF, luego del operador ? y por ultimo el operador ??

IF
string nombre = obtenerNombre(id);
if (nombre==null)
  return "Desconocido";           
Else
  return nombre;


?
return obtenerNombre(id)==null?"Desconocido":obtenerNombre(id);

??
return obtenerNombre(id) ?? "Desconocido"; 



Operador ternario en VB 

Ahora, en VB tambien puede usarse el IIF a modo de imitar la comparación del operador ternario, pero en realidad no funciona de esta manera, ya que un operador ternario es eso: un operador y el IIF trabaja mas como una función la cual es invocada en tiempo de ejecución por lo que evalúa todos sus parámetros (no importa si la condición se cumple con el primero, siempre irá a evaluar el segundo) y en caso que los parámetros estén vacíos o no contengan una expresión valida, dará una Formatexception en tiempo de ejecución.

ademas de esto al ser una función lo que se devuelve en VB no es del mismo tipo que las variables o entidades que estamos manejando sino que devuelve un Object generico, que nos obliga a hacer una conversión al tipo deseado (CInt, CType…), miren este ejemplo donde se hace una conversión:

Dim s1 As String = Nothing
Dim s2 As String = IIf(s1 Is Nothing,"(undefined)", s1).ToString

o bien:

Dim s1 As String = Nothing
Dim s2 As String = CStr(IIf(s1 Is Nothing, "(undefined)",s1))


en Visual Basic 2010 ó 9 para ser mas exquisitos, se puede usar el operador ternario, aunque siempre precedido del if, des esta manera puede emular un operador y no una función y así, no esta en la necesidad de evaluar los dos parámetros, si con el primero cumple pues se ejecuta la condición

Dim comparacion as String = If( a>b ? "a es mayor que b", "a es menor o igual que b")


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.