Uma das novidades implementadas na linguagem C# 4.0 foi a adição de Named and Optional Parameters.

Parâmetros Opcionais e Nomeados são duas características bem distintas e muito úteis quando utilizadas juntas. Parâmetros opcionais permitem que você omita alguns argumentos quando da chamada a um método. Já os Parâmetros Nomeados é uma forma de oferecer um argumento usando o nome do parâmetro correspondente em vez de depender da sua posição na lista de parâmetros.

Algumas APIs, principalmente as interfaces COM, como as APIs de automatização do Office, são escritas especificamente com parâmetros nomeados e parâmetros opcionais em mente. Até agora tem sido muito doloroso chamar essas APIs em C #, algumas vezes chamamos métodos com muitos argumentos e todos devem ser explicitamente passados, sendo que a maioria possuem valor padrão e poderiam ser omitidos.

Mesmo em APIs para. NET, você às vezes encontra-se obrigado a escrever muitas sobrecargas de um método com diferentes combinações de parâmetros, a fim de proporcionar o máximo de usabilidade para os utilizadores. Com a implementação de Parâmetros Opcionais e Parâmetros Nomeados, não necessitamos mais de criar tais sobrecargas, tornando assim nossos códigos mais limpos e reutilizáveis, além é claro de nos oferecer uma manutenção muito mais prática.

Parâmetros Opcionais

Para declararmos parâmetros opcionais basta apenas definirmos valores padrão para eles

public static int FazAlgo( int x, int y = 2, int z = 5 )
{ 
    return x + y + z; 
}

Nome método acima os parâmetros “y” e “z” são opcionais, isso nos dá a flexibilidade de realizarmos as seguintes chamadas sem a necessidade de criarmos overload do método.

static void Main( string[] args )
{
    Console.WriteLine( FazAlgo( 5 ) );    // omitindo y e z
    Console.WriteLine( FazAlgo( 5, 7 ) ); // omitindo apenas z
    Console.WriteLine( FazAlgo( 5, 7, 9 ) );
    Console.ReadLine();
}

Nomeados e Argumentos Opcionais

No C#4.0 apesar de possuirmos os argumentos opcionais, argumentos entre virgula não podem ser omitidos, assim como FazAlgo( 5, , 9 ), para que isso seja possível devemos passar estes argumentos através de seu nome. Veja abaixo.

static void Main( string[] args )
{
    Console.WriteLine( FazAlgo( 5, z: 10 ) );  // passagem do argumento por nome
    Console.WriteLine( FazAlgo( z:4, x:5, y: 14 ) ); // passagem dos argumentos de forma inversa
    Console.ReadLine();
}

Observem também que podemos inclusive mudar a ordem dos argumentos sem que isso interfira na chamada ao método.

Esta melhoria que o C# 4.0 recebeu nos ajudou bastante principalmente no que diz respeito a overload de métodos onde o custo para criação e manutenção é grande se vermos pelo lado de que podemos ter métodos com mais de 7 overloads, imaginem a manutenção disso, seria muito custosa.