Parámetros opcionales en C# 4.0

Una de las nuevas características preparadas para C# 4.0 son los parámetros opcionales, ya conocidos por Visual Basic .NET. El objetivo será declarar nuestros métodos, constructores e indexadores con unos valores por defecto en el caso de no indicarlos en la llamada.

using System;
namespace ParametrosOpcionales
{
    class Program
    {
        static void Main()
        {
            DatosPersonales("Gisela");
            DatosPersonales("Gisela", "Perez");
            DatosPersonales("Gisela", "Perez", 10);
            Console.ReadLine();
        }
        static void DatosPersonales(string nombre, string apellido = "Torres", int edad = 20)
        {
            Console.WriteLine("Nombre:{0} Apellido:{1} Edad:{2}", nombre, apellido, edad);
        }
    }
}

Podemos realizar distintas llamadas indicando únicamente el obligatorio, el obligatorio y uno de los opcionales o todos ellos. Visto así, podemos preguntarnos cuál sería la manera de llamar a nuestro método pasándole como argumentos el primer parámetro y el último, sin querer saber nada del segundo. ¿Esto es posible? Afortunadamente si y aquí es donde entran en juego los argumentos nombrados, pensados para casos como este.

DatosPersonales(nombre: "Jose");
DatosPersonales(nombre: "Pedro", apellido: "Leal");
DatosPersonales(edad: 40, apellido: "Rodriguez", nombre: "Laura");

Si utilizamos este tipo de llamada, incluso es posible alterar el orden de los parámetros.

Podemos llegar a pensar en la posibilidad de olvidarnos de la sobrecarga en algunos casos, sobre todo por el ahorro de código que esto supone. También es cierto que podemos necesitar que la sobrecarga y los parámetros opcionales convivan.

using System;
namespace ParametrosOpcionales
{
    class Program
    {
        static void Main()
        {
            ejemplo("Hola");
            Console.ReadLine();
        }
        static void ejemplo(object saludo)
        {
            Console.WriteLine("Object: {0}", saludo);
        }
        static void ejemplo(string saludo, string nombre = "Gisela")
        {
            Console.WriteLine("{0} {1}", saludo, nombre);
        }
        static void ejemplo(string saludo)
        {
            Console.WriteLine("Simplemente {0}", saludo);
        }
    }
}

En este ejemplo, existen tres tipos de sobrecarga. Si nosotros únicamente pasamos como argumento un string («Hola») debemos tener claro cual de los tres métodos será el candidato. Hay que tener en cuenta lo siguiente:

  1. Siempre se elegirá en primer lugar aquel método que no necesite convertir el dato que le estamos pasando a otro tipo.
  2. Tendrá preferencia aquel que no necesite omitir sus parámetros opcionales.

Así pues, si arrancamos este ejemplo comprobaremos que la sobrecarga elegida será la tercera por ser el argumento del mismo tipo y por no contener parámetros opcionales que no se están teniendo en cuenta en nuestra llamada.

SimplementeHola

¡Saludos!