O C# 4 traz uma série de novidades em sua estrutura. Uma delas é poder ter parâmetros opcionais em métodos, construtores e indexadores. Vamos ver aqui na prática como utilizar. Imagine a situação onde você precisa criar um método com vários parâmetros, alguns já possuem valor padrão, outros não, veja Listagem 1.
Listagem 1. Parâmetros opcionais
public DialogResult ExibirMensagem(string mensagem, MessageBoxButtons botoes,
MessageBoxIcon icone, string tituloJanela = "Aviso Devmedia", bool salvar = false, bool sobrescrever = false)
{
var result = MessageBox.Show(mensagem, tituloJanela, botoes, icone);
if (salvar)
{
var sb = new StringBuilder();
sb.Append("Na pergunta ");
sb.Append(mensagem);
sb.Append(" o usuário escolheu: ");
sb.Append(result.ToString());
if (sobrescrever)
{
File.WriteAllText("D:\\Paulo\\resposta.txt", sb.ToString());
}
else
{
File.AppendAllText("D:\\Paulo\\resposta.txt", sb.ToString());
}
}
return result;
}No método ExibirMensagem estamos encapsulando o MessageBox para adicionar um comportamento extra: registrar em um arquivo o que foi escolhido pelo usuário. Dessa forma nós podemos já definir alguns valores padrão para o método. Isso está explícito nos parâmetros tituloJanela, salvar e sobrescrever (Figura 1).

Figura 1. Parâmetros com valores padrão
Ao utilizar o sinal de igual, estamos atribuindo um valor padrão e com isso indicando que o parâmetro é opcional. Contudo há uma exigência. Os parâmetros opcionais devem ser os últimos da lista. Você não pode ter o primeiro parâmetro opcional e o segundo não. Assim, podemos fazer uso do método da seguinte forma:
ExibirMensagem("Testando parâmetros opcionais: Nenhum opcional foi passado",
MessageBoxButtons.OK, MessageBoxIcon.Information); Observe que nenhum dos parâmetros opcionais foi passado. Quando o método for executado, o valor padrão de cada um será utilizado. Assim, teremos o resultado visto na Figura 2.

Figura 2. Diálogo em execução
Como pode ser visto, o título que foi utilizado na janela foi o valor padrão do parâmetro tituloJanela. E como podemos passar valores para algum parâmetro opcional? Veja na sequência:
ExibirMensagem("Testando parâmetros opcionais: Apenas dois foram passados",
MessageBoxButtons.OK, MessageBoxIcon.Information,salvar:true); Quando temos mais de um parâmetro opcional, é necessário informar o nome do parâmetro. Veja que usamos “salvar:true”. Esse é o recurso chamado parâmetros nomeados. Ao utilizar esse recurso podemos passar os parâmetros na ordem que desejarmos, na ordem que for mais lógica para nós. No exemplo do método que criamos o parâmetro que indica o título da janela ficou no final, por uma obrigatoriedade da linguagem, mas podemos na utilização mudar isso. Veja o código:
ExibirMensagem(tituloJanela: "Atenção",
mensagem: "Reorganizando os parâmetros",
botoes: MessageBoxButtons.OK,
icone: MessageBoxIcon.Information); Com isso temos dois pontos úteis no recurso de nomeação de parâmetros:
- Reorganização dos parâmetros: podemos ajustá-los de forma que faça mais sentido para nós;
- Melhora na leitura: ao olhar um método em uso, e sua lista de parâmetros, quem nunca se perguntou o que o valor “false” faz ali no meio. Pensando nisso, nomear os parâmetros garante que pelo seu nome, possamos identificar seu uso. Assim não é necessário abrir o help ou, a assinatura do método, para identificar o que determinado parâmetro faz.