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.


Related Posts:

  • Archivo de base de datos localHooooola a los sabios de la UCA, como me di cuenta que "no se acordaban" de estas cosas por mas sencillas que ellos mismos gritan que son, les dejo esta entrada para "ayudarles a recordar" Por lo general las bases de datos p… Read More
  • ComboBoxpara agregar valores a un ComboBox solo debe hacerse esto ComboBox.Items.Add("Direccion correo Hotmail") ComboBox.Items.Add("Direccion correo Gmail") ComboBox.Items.Add("Direccion correo Yahoo") ComboBox.Items.Add("Direccio… Read More
  • Build Solution (F6) y Start debugging (F5)   Build Solution (F6) y Start debugging (F5) Cuando seleccionamos Build solution en la opción Build del menú principal o presionamos F6, el IDE compila nuestro programa. El IDE lo hace corriendo el compilado… Read More
  • Read con valores   Read con valores presentar los datos de una tabla puede ser imposible, pero si sabemos que hay pocos algunas veces es util acordarse de este parte de codigo, por ejemplo aqui solo habrian tres vigilantes, en la … Read More
  • DGV y TextBox   DGV y TextBox Este código en VB muestra los datos de una tabla en un DataGridView y al dar click sobre la celda llena los valores en los respectivos textbox, fácil. Imports System.Data Im… Read More