Menu

Parámetros nombrados y opcionales en C# 4.0

julio 21, 2013 - .NET

Bienvenidos una vez mas a otra entrada de EduardoOrtega.ME(), en esta ocasión tal como dice el título el post hablaré de una característica incluida en el .NET Framework 4.0 (Visual Studio 2010). Si bien esta por lo menos a mi no me ha tocado implementarla, es importante conocer y estudiar a fondo nuestra herramienta de trabajo que es Visual Studio en todas sus versiones.

Requisitos

Manos a la obra!

Named Parameters

A pesar que esta utilísima característica se incluyo en la versión 4.0 de C#, VB en general ha contado con parámetros opcionales y nombrados desde hace bastante tiempo, y nos puede ayudar a la hora de simplificar la escritura de un método con bastantes parámetros evitando la sobrecarga del mismo (y de paso rompiendo con una de las características de la POO). Esta nueva particularidad nos propone poder consumir un método sin necesidad que tengamos que especificar los valores en el orden que propone el método como tal, sino que utilizando el nombre de los parámetros que espera recibir podemos enviarlo en el orden que queramos. Por ejemplo, tenemos un método para enviar correos con una serie de parámetros como el remitente, el destino, a quien queremos copiar, etc…, así:

static void SendEmail(string from, string to, string cc, string bcc)
        {
            Console.WriteLine("Sending mail....");
            Console.WriteLine(string.Format("From: {0}", from));
            Console.WriteLine(string.Format("To: {0}", to));
            Console.WriteLine(string.Format("Carbon copy: {0}", cc));
            Console.WriteLine(string.Format("Blind carbon copy: {0}", bcc));
            Console.ReadKey();
        }

y el uso normal de consumo en la aplicación es el siguiente:

static void Main(string[] args)
        {
            SendEmail("eortega@mail.com", "fpardo@mail.com", "gerencia@mail.com", "mijefe@mail.com");
        }

Como vemos es un programa bien sencillo que simplemente imprime los valores que hemos enviado en pantalla:

image

En el ejemplo anterior puse los argumentos en el orden que especifica la firma del método, pero con named parameters puedo enviarlos en el orden que yo deseo:

static void Main(string[] args)
        {
            SendEmail(bcc: "mijefe@mail.com", cc: "gerencia@mail.com", to: "fpardo@mail.com", from: "eortega@mail.com");
        }

Hay un par de cosas que debo recalcar del código anterior, lo primero es notar que para poder escribir los parámetros en el orden que nos apetezca debemos escribir su nombre seguido de dos puntos (parameter: value), así indicamos al compilador que estamos usando esta característica. También podemos ver que coloque los parámetros a la inversa y el resultado que produce es exactamente el mismo. Ahora, muchos dirán “No pues con esto ya puedo salvar al mundo!”, y la respuesta es que no precisamente pero su utilidad se ve mejor cuando se combina con parámetros opcionales.

Optional Parameters

Aunque los parámetros rompen con una de las características de la POO que es la sobrecarga, esto no le quita la tremenda utilidad que tienen.

Los parámetros opcionales como lo indica su nombre nos permite especificar qué parámetros de la firma del método queremos enviarle, o simplemente podemos no enviarle ninguno, así nos ahorramos construir sobrecargas del método con los parámetros que necesitamos, veamos un ejemplo:

Lo primero que necesitamos hacer para usar parámetros opcionales es colocarle valores por defecto a los parámetros de la firma de nuestro método, siguiendo con el ejemplo del envío de correo quedaría así:

static void SendEmail(string from = null, string to = null, string cc = null, string bcc = null)
        {
            Console.WriteLine("Sending mail....");
            Console.WriteLine(string.Format("From: {0}", from));
            Console.WriteLine(string.Format("To: {0}", to));
            Console.WriteLine(string.Format("Carbon copy: {0}", cc));
            Console.WriteLine(string.Format("Blind carbon copy: {0}", bcc));
            Console.ReadKey();
        }

Solo he cambiado la firma a colocarle valores por defecto (En este caso NULL, pero puede ser cualquier otro valor que queramos), ahora puedo por ejemplo enviarle solo el parámetro “to” omitiendo los valores de los demás, de la siguiente forma:

static void Main(string[] args)
        {
            SendEmail(to: "fpardo@mail.com");
        }

Me he ahorrado la sobrecarga del método que cumpla con esta necesidad solo colocándole valores por defecto a los parámetros del método, ahora si ven la utilidad de los parámetros opcionales?. Esta es la salida que produce:

image

Los demás parámetros no se muestran (Un nulo no produce salida), pero igual hubiese podido preguntar por cual parámetro es enviado sin null y así mejorar el método.

También se pueden combinar parámetros opcionales con no opcionales con una única condición, primero deben declararse en la firma los parámetros no opciones y luego los opcionales, de lo contrario tendremos un hermoso error de compilación.

Conclusión

Si bien como lo comente anteriormente la característica de parámetros opcionales rompe con una de las principales principios de la POO, no debemos negar que nos ahorra bastantes líneas de código, yo personalmente creo en la POO como religión, pero eso ya es decisión de cada quien si lo usa o no.

Happy coding!!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *