Este é um post disponível para assinantes MVPEste post também está disponível para assinantes da Easy .net magazine
ou para quem possui Créditos DevMedia. Clique aqui para saber mais!
ou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Aprenda a criar parâmetros opcionais e nomeados - Revista easy .net Magazine 24
O artigo explica e demonstra na prática o que são os parâmetros opcionais e nomeados no C# 4.0. Este recurso permite que sejam criados métodos com parâmetros flexíveis, trazendo mais reusabilidade na hora de invocá-los.
Easy .net magazine 24
[Artigo disponível no Leitor Digital DevMedia. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Easy .net magazine 24
[Artigo disponível no Leitor Digital DevMedia. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Easy .net magazine 24
O C# é uma linguagem orientada a objetos. Assim, os métodos correspondem a principal forma de realizar tarefas lógicas. É comum que estes precisem receber sobrecargas, já que normalmente os (bons) programas passam por evoluções.
Até a versão quatro do C#, não havia alternativa para criar sobrecarga de métodos, a não ser criando um novo. Se houvesse a necessidade de adicionar novos parâmetros, era o único e correto caminho a seguir, até porque, se alterarmos o número de parâmetros em um método existente, todas as chamadas para este tornam-se inválidas, já que no C# (também até a versão quatro) não era possível omitir um parâmetro, como é possível fazer no Visual Basic, por exemplo. Logo, se tivesse um método com dois parâmetros e precisasse acrescentar um terceiro, precisaria criar um novo método, ainda que o código interno permanecesse o mesmo do original.
Array de parâmetros como solução alternativa
Uma forma de contornar essa exigência quanto ao número de parâmetros é usando o argumento “params” como o último parâmetro em uma assinatura (cabeçalho) de um método. Desta forma, é possível definir um tipo de dado (ou object se quiser usar vários tipos de dados) que pode ou não ser informado. Considere o método “AbrirArquivo” do exemplo.
public bool AbrirArquivo(string nomeDoArquivo, params object[] opcoes) { ... }
Ao usar um array de object é possível que os próximos parâmetros sejam potencialmente de qualquer tipo que se tenha necessidade, como sugere a demonstração:
AbrirArquivo("c:\\MeuArquivo.txt", true);
AbrirArquivo("c:\\MeuArquivo.txt", true, 1024);
AbrirArquivo("c:\\MeuArquivo.txt", true, 1024, READ_ONLY);
A primeira chamada passa um valor string correspondente ao nome do arquivo e um boolean como segundo parâmetro (que pode ser omitido). Na segunda é acrescentado um valor inteiro e na terceira um dado definido como constante (const).
Esta solução é mais apropriada em projetos legados (antigos) ou quando não é possível usar C# 4, como em softwares que, por questões de infraestrutura dos usuários, não podem ser escritos em versões diferentes do Framework .NET.
No entanto, esta solução cria um problema: a necessidade de verificação bem feita dos tipos de dados durante as conversões de tipos. Pode ser que, ao fazer a chamada do método, os parâmetros a partir do segundo venham em uma ordem diferente da esperada e ainda é preciso verificar o tamanho do número de parâmetros para fazer a operação corretamente.
Nota: para verificar o tipo de um objeto use o método .GetType() em conjunto com typeof() do C# ou se quiser obter a string correspondente ao tipo, GetType().ToString(). Isto pode ajudar a limitar um conjunto de tipos previamente estabelecido e verificar com um bloco switch... case.
Parâmetros Opcionais
Desta forma, a Microsoft adicionou um novo recurso ao C# denominado parâmetros opcionais. Os mesmos estão presentes desde a versão 1.0 do framework .NET, mas somente na linguagem VB.NET. Para a utilização deste último era necessário indicar a palavra reservada “optional” na criação do parâmetro, tornando-o um parâmetro opcional.
A utilização dos parâmetros opcionais no C# é uma boa escolha para substituir a sobrecarga de construtores (citada no início do artigo). Considere ter de adicionar um segundo parâmetro ao método do exemplo anterior, tendo que indicar se o arquivo deve ser aberto como somente leitura. Para usar um parâmetro opcional basta seguir esta sintaxe:
public bool AbrirArquivo(string nomeDoArquivo, bool SomenteLeitura = false ) { ... }
Note que um parâmetro opcional é indicado usando o sinal de igual. Além de você indicar que o mesmo será um parâmetro opcional, é estabelecido um valor padrão para o mesmo (após o sinal de igual). Note ainda que não é necessária a utilização do “optional” do VB. Com isto, reduzimos o número de overloads que seriam necessários para a criação de vários métodos com diferentes parâmetros. Além disso, também facilita a utilização de sua classe, deixando claro quais são os valores padrões. Não será necessário alterar nenhum código que faz a chamada a este método, mesmo que ele tenha sofrido qualquer alteração em sua assinatura, visto que um de seus parâmetros tornou-se opcional.
Outra vantagem que você possui ao utilizar os parâmetros opcionais é que, no Visual Studio, os mesmos são mostrados em seu IntelliSense, entre colchetes, como na Figura 1.
"
Este é um post disponível para assinantes MVP
Até a versão quatro do C#, não havia alternativa para criar sobrecarga de métodos, a não ser criando um novo. Se houvesse a necessidade de adicionar novos parâmetros, era o único e correto caminho a seguir, até porque, se alterarmos o número de parâmetros em um método existente, todas as chamadas para este tornam-se inválidas, já que no C# (também até a versão quatro) não era possível omitir um parâmetro, como é possível fazer no Visual Basic, por exemplo. Logo, se tivesse um método com dois parâmetros e precisasse acrescentar um terceiro, precisaria criar um novo método, ainda que o código interno permanecesse o mesmo do original.
Array de parâmetros como solução alternativa
Uma forma de contornar essa exigência quanto ao número de parâmetros é usando o argumento “params” como o último parâmetro em uma assinatura (cabeçalho) de um método. Desta forma, é possível definir um tipo de dado (ou object se quiser usar vários tipos de dados) que pode ou não ser informado. Considere o método “AbrirArquivo” do exemplo.
public bool AbrirArquivo(string nomeDoArquivo, params object[] opcoes) { ... }
Ao usar um array de object é possível que os próximos parâmetros sejam potencialmente de qualquer tipo que se tenha necessidade, como sugere a demonstração:
AbrirArquivo("c:\\MeuArquivo.txt", true);
AbrirArquivo("c:\\MeuArquivo.txt", true, 1024);
AbrirArquivo("c:\\MeuArquivo.txt", true, 1024, READ_ONLY);
A primeira chamada passa um valor string correspondente ao nome do arquivo e um boolean como segundo parâmetro (que pode ser omitido). Na segunda é acrescentado um valor inteiro e na terceira um dado definido como constante (const).
Esta solução é mais apropriada em projetos legados (antigos) ou quando não é possível usar C# 4, como em softwares que, por questões de infraestrutura dos usuários, não podem ser escritos em versões diferentes do Framework .NET.
No entanto, esta solução cria um problema: a necessidade de verificação bem feita dos tipos de dados durante as conversões de tipos. Pode ser que, ao fazer a chamada do método, os parâmetros a partir do segundo venham em uma ordem diferente da esperada e ainda é preciso verificar o tamanho do número de parâmetros para fazer a operação corretamente.
Nota: para verificar o tipo de um objeto use o método .GetType() em conjunto com typeof() do C# ou se quiser obter a string correspondente ao tipo, GetType().ToString(). Isto pode ajudar a limitar um conjunto de tipos previamente estabelecido e verificar com um bloco switch... case.
Parâmetros Opcionais
Desta forma, a Microsoft adicionou um novo recurso ao C# denominado parâmetros opcionais. Os mesmos estão presentes desde a versão 1.0 do framework .NET, mas somente na linguagem VB.NET. Para a utilização deste último era necessário indicar a palavra reservada “optional” na criação do parâmetro, tornando-o um parâmetro opcional.
A utilização dos parâmetros opcionais no C# é uma boa escolha para substituir a sobrecarga de construtores (citada no início do artigo). Considere ter de adicionar um segundo parâmetro ao método do exemplo anterior, tendo que indicar se o arquivo deve ser aberto como somente leitura. Para usar um parâmetro opcional basta seguir esta sintaxe:
public bool AbrirArquivo(string nomeDoArquivo, bool SomenteLeitura = false ) { ... }
Note que um parâmetro opcional é indicado usando o sinal de igual. Além de você indicar que o mesmo será um parâmetro opcional, é estabelecido um valor padrão para o mesmo (após o sinal de igual). Note ainda que não é necessária a utilização do “optional” do VB. Com isto, reduzimos o número de overloads que seriam necessários para a criação de vários métodos com diferentes parâmetros. Além disso, também facilita a utilização de sua classe, deixando claro quais são os valores padrões. Não será necessário alterar nenhum código que faz a chamada a este método, mesmo que ele tenha sofrido qualquer alteração em sua assinatura, visto que um de seus parâmetros tornou-se opcional.
Outra vantagem que você possui ao utilizar os parâmetros opcionais é que, no Visual Studio, os mesmos são mostrados em seu IntelliSense, entre colchetes, como na Figura 1.
"
A exibição deste artigo foi interrompida.
Este é um post disponível para assinantes MVPEste post também está disponível para assinantes da Easy .net magazine
ou para quem possui Créditos DevMedia. Clique aqui para saber mais!
ou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Vladimir Rech
Formado em Tecnologia em desenvolvimento de software pela UTF/PR. Desenvolvedor de software. Palestrante.
O que você achou deste post?
Cursos relacionados
Publicidade



