Uma das coisas que senti falta como comecei a desenvolver em C#, foi um recurso muito útil para criação de sobrecargas de métodos: os parâmetros opcionais. Como creio que todos sabem, no C# para fazer uma sobrecarga de métodos, criamos uma nova assinatura com a combinação de parâmtros que queremos. Mas acontece que apesar de ser mais organizado (aprendi a pensar assim com o passar do tempo), quando temos um método com 5 ou 6 parâmetros e muitas possíbilidades de execução… acabamos fazendo uma permutação das combinações de parâmetros e consequentemente criando muitos métodos de sobrecarga.

Para nossa alegria, dentre as novidades do C# 4.0… temos dois novos recursos que são: parâmetros opcionais e os parâmetros nomeados. Os parâmetros opcionais já faziam parte de VB.Net mas agora é possível fazer isso também no C # ao invés de usar métodos de sobrecarga. Economizando assim algumas linhas e muitas assinaturas desnecessárias. Já os parâmetros nomeados, creio que seja uma novidade "inédita".

private Rectangle DrawBox(int size, string color = "#FF0000", int borderSize = 1) 
{
    /// implementação do método
}

Exemplo da utilização do parâmetro opcional:

var defaultBox = DrawBox(10); 

Neste caso, será criado um objeto Box, com o size = 10, color = "#FF0000" e o borderSize = 1. Pois como não houve nenhuma entrada de valor para o color e boderSize o valor atribuído será o mesmo que existe na assinatura do método.

Se por exemplo, quizermos criar a mesma Box, porém ao invés de criá-la na cor padrão ("#FF0000"), nós a quizesemos na cor preta, bastaria informar o segundo parâmetro apenas.

var blackBox = DrawRectangle(10, "#000000"); 

Já os parâmetros nomeados servem, para "extender" os parâmetros opcionais, pois nos permite utilizar as assinaturas sem nos ater à ordem os parâmetros, bastando saber o nome do mesmo. Neste exemplo, criei um objeto configurando apenas o tamanho da borda (terceiro parâmetro na assinatura) sem informar uma "color".

var doubleBorderBox = DrawRectangle(10, borderSize: 2); 

O mais importante, é ir com calma na utilização destes recursos para não acabar criando funções que façam coisas muito diferentes num mesmo método, trazendo uma certa confusão para seu aplicativo.