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#
string comparacion = a > b ? "a es mayor que b" : "a es menor o igual que b";
Null Coalescing Operator (??) en C#
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();
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";
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
Dim s1 As String = Nothing
Dim s2 As String = CStr(IIf(s1 Is Nothing, "(undefined)",s1))
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.