Parâmetros opcionais e nomeados do C#

CSharp-BloodQuando estamos desenvolvendo uma aplicação muitas vezes precisamos passar diversos argumentos para um construtor ou método de uma classe. Em uma loja, por exemplo, gostaríamos de cadastrar um novo produto que terá as propriedades descrição, preço, nome, quantidade em estoque e fornecedor, para representar esse produto teríamos a seguinte classe:

public class Produto
{
  public String Descricao { get; set; }
  public String Nome { get; set; }
  public Decimal Preco { get; set; }
  public int Quantidade { get; set; }
  public String Fornecedor { get; set; }
}

Para obrigar o preenchimento de todos os campos do produto, podemos criar um construtor que recebe essas informações:

public Produto (String descricao, String nome, Decimal preco, int quantidade, String fornecedor)
{
 this.Descricao = descricao;
 this.Nome = nome;
 this.Preco = preco;
 this.Quantidade = quantidade;
 this.Fornecedor = fornecedor;
}

Mas algumas vezes não sabemos todas as informações necessárias para o cadastro do produto, nesses casos, queremos utilizar valores padrões para os campos:

new Produto("sem descrição", "sem nome", 0.0m, 0, "sem fornecedor");

O problema dessa abordagem é que teríamos que utilizar consistentemente esses valores padrão em todos os pontos do sistema. Nessa situação, podemos utilizar os parâmetros opcionais do C#.

Para definirmos um valor opcional no construtor, precisamos declarar o parâmetro e atribuir qual será o valor padrão:

public Produto (String descricao = "sem descrição", String nome = "sem nome",
 Decimal preco = 0.0m, int quantidade = 0, String fornecedor = "sem fornecedor")
{
 this.Descricao = descricao;
 this.Nome = nome;
 this.Preco = preco;
 this.Quantidade = quantidade;
 this.Fornecedor = fornecedor;
}

Com isso, ao executarmos o código:

Produto p = new Produto();

Teremos um na variável p um produto preenchido com todos os valores padrão que foram definidos na declaração do construtor. Além disso, podemos definir, por exemplo, o nome e a descrição simplesmente enviando essas informações como parâmetros:

// sobrescreve apenas o nome e a descrição
Produto p = new Produto ("Apostila do curso de C# da Caelum", "Apostila de C#");

Mas e se tivermos apenas o nome do produto? Como o primeiro argumento do construtor é a descrição, temos de fornecer a descrição para só depois passar o nome. Nessa situação, gostaríamos de chamar o construtor falando que o parâmetro passado representa o nome do produto, para isso, utilizamos os parâmetros nomeados do C#.

Quando queremos utilizar um parâmetro nomeado, precisamos falar o nome do parâmetro seguido de ‘:’ e depois o valor que será colocado no parâmetro, no exemplo, poderíamos chamar o construtor do produto da seguinte forma:

Produto p = new Produto(nome: "Apostila de C#");

Com esse código, construímos um produto definindo apenas o nome, as outras informações ainda estão com os valores padrão definidos no código do construtor.

Para mais informações sobre os argumentos nomeados e opcionais, consulte o guia de programação da msdn. Conheça também os cursos de .NET da Caelum!

Tags: ,

19 Comentários

  1. Roberto Shizuo 07/08/2013 at 12:19 #

    Venho do Java e cada vez to gostando mais de c#. bom post.

  2. Daniel Oliveira 07/08/2013 at 15:06 #

    Mesmo com o NHibernate, que nos “obriga” a ter um construtor padrão, é possivel trabalharmos com parâmetros nomeados? Sem essa abordagem, as regras do sistema são quebradas em pro do uso do ORM.

  3. Victor Kendy Harada 07/08/2013 at 20:38 #

    Você tem razão Daniel, o NHibernate obriga as entidades a terem um construtor sem argumentos, mas as entidades são apenas uma parte do código do sistema. Em um sistema web, por exemplo, teríamos os controllers da aplicação que podem utilizar os construtores para pedir suas dependências.

    Além disso, podemos utilizar constraints no banco de dados para garantir que toda entidade que está gravada está num estado válido e o construtor da classe pode ser utilizado para receber as informações essenciais para o modelo.

  4. Victor Kendy Harada 07/08/2013 at 20:38 #

    Obrigado Roberto.

  5. Leonardo 09/08/2013 at 01:09 #

    …ou você cria mais de um método construtor usando o principio da sobrecarga da programação OO.

  6. Mauricio Aniche 12/08/2013 at 12:28 #

    É o que geralmente fazemos. Criamos um construtor padrão, só para o NHibernate. Até geralmente escondemos esse construtor.

  7. Abraão Isvi 10/09/2013 at 13:09 #

    Já trabalhei com c++ e agora tenho trabahado com java, mas algumas vezes venho fazendo algumas coisas em c# e tenho gostado.

    Obrigado pelo post.

  8. Filipe 02/06/2014 at 11:09 #

    O C# realmente possui uma sintaxe poderosa.

    Muito bom o post.

  9. Delmira 03/09/2014 at 15:10 #

    muito bom material, acompanho as aulas e ajudam-me muito.

  10. Jônatas Bueno 23/03/2015 at 15:33 #

    Estou cursando análise e desenvolvimento de sistemas e gostei de c# havia visto apenas C++ antes… Pretendo me especializar em .Net, aceito sugestões de cursos

  11. Igo Gomes 23/04/2015 at 15:50 #

    Ótimo material complementar. Simples e objetivo.

  12. Diogo 09/07/2015 at 10:29 #

    O uso dos parâmetros nomeados e dos valores padrão (https://msdn.microsoft.com/en-us/library/dd264739.aspx), deixam o código mais claro, tanto para quem lê como para quem vai usar.
    Parabéns pelas dicas!!!

  13. Yuri 02/09/2015 at 10:04 #

    Excelente Post! Entendi o conteúdo em menos de 10 min.

    Excelente didática, que Deus continue lhe abençoando, até a próxima!

  14. Mathias 16/11/2015 at 20:18 #

    Imagine a seguinte situação: Você tem dois métodos com o mesmo nome (sobrecarga) e ambos possem um parâmetro em comum (“String nome” por exemplo). Ao fazer a chamada MetodoComSobrecarga(nome : “Nome da pessoa”); qual dos dois métodos será chamado??

  15. Rodolfo 16/01/2016 at 20:31 #

    Acredito que o primeiro método

  16. Alexandre Aparecido dos Santos 03/09/2017 at 13:39 #

    Material didático é super claro, as postagens também, tudo muito direto! Parabéns a toda a equipe!

  17. Rodrigo Torres 21/10/2017 at 21:30 #

    Apostila e complementos simplesmente sensacionais. De graça ainda por cima. Admirável.

  18. Edivan 18/12/2017 at 15:19 #

    se eu fizer um banco de dados antes com essas informações em uma tabela não permitindo nulo para nenhum desses itens, já não seria uma obrigatoriedade de inserção de valores ?

  19. Rodrigo Bertini 27/06/2018 at 21:07 #

    Show, material muito bom e bem explicado.

Deixe uma resposta