Argumentos Nomeados
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 49 de 70.
Argumentos nomeados permitem que você especifique qual parâmetro recebe um valor usando seu nome, em vez de depender da posição. Isso torna as chamadas de método mais claras e permite que você passe argumentos em qualquer ordem.
Use o nome do parâmetro seguido por dois pontos antes do valor:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// Usando argumentos nomeados
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // Qualquer ordem funcionaArgumentos nomeados brilham quando combinados com parâmetros opcionais. Em vez de fornecer todos os valores opcionais precedentes, você pode pular diretamente para aquele que precisa:
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// Pula port e useSSL, especifica apenas timeout
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);Você pode misturar argumentos posicionais e nomeados, mas os argumentos posicionais devem vir primeiro. Argumentos nomeados melhoram a legibilidade, especialmente para métodos com múltiplos parâmetros do mesmo tipo ou sinalizadores (flags) booleanos onde o significado não é óbvio apenas pelo valor.
Desafio
FácilVamos construir um gerador de relatórios que aproveita os argumentos nomeados para tornar as chamadas de método cristalinas. Quando os métodos têm múltiplos parâmetros - especialmente aqueles do mesmo tipo ou sinalizadores booleanos - os argumentos nomeados tornam seu código autodocumentado.
Você organizará seu código em dois arquivos:
ReportGenerator.cs: Crie uma classeReportGeneratorno namespaceReportscom um método que possui vários parâmetros opcionais:GenerateReport(string title, string author = "Anonymous", bool includeHeader = true, bool includeSummary = false, int maxPages = 10)- Este método deve retornar uma string formatada descrevendo a configuração do relatório
- Formato:
Report: {title} by {author} | Header: {Yes/No}, Summary: {Yes/No}, Max Pages: {maxPages}
Program.cs: No seu arquivo principal, demonstre o poder dos argumentos nomeados chamandoGenerateReportde diferentes maneiras - pulando parâmetros opcionais que você não precisa e especificando apenas aqueles que importam para cada relatório.
Você receberá três entradas:
- Título do primeiro relatório
- Título do segundo relatório
- Título do terceiro relatório
Gere três relatórios com diferentes configurações:
- Primeiro relatório: Use apenas o título (todos os padrões se aplicam)
- Segundo relatório: Use o título com
includeSummary: trueemaxPages: 25(pule author e includeHeader, mantendo seus padrões) - Terceiro relatório: Use o título com
author: "Admin",includeHeader: falseeincludeSummary: true(mantenha o padrão de maxPages)
Imprima o resultado de cada relatório em sua própria linha.
Por exemplo, se as entradas forem Sales Q1, Annual Review e Inventory Check, a saída deve ser:
Report: Sales Q1 by Anonymous | Header: Yes, Summary: No, Max Pages: 10
Report: Annual Review by Anonymous | Header: Yes, Summary: Yes, Max Pages: 25
Report: Inventory Check by Admin | Header: No, Summary: Yes, Max Pages: 10Observe como os argumentos nomeados permitem que você pule diretamente para os parâmetros que lhe interessam - você não precisa especificar author ou includeHeader apenas para alterar includeSummary. Isso torna suas chamadas de método muito mais legíveis e reveladoras de intenção!
Folha de consulta
Argumentos nomeados permitem que você especifique qual parâmetro recebe um valor usando seu nome, em vez de depender da posição. Isso torna as chamadas de método mais claras e permite que você passe argumentos em qualquer ordem.
Use o nome do parâmetro seguido por dois pontos antes do valor:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// Usando argumentos nomeados
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // Qualquer ordem funcionaArgumentos nomeados funcionam bem com parâmetros opcionais. Você pode pular diretamente para o parâmetro que precisa sem fornecer todos os valores opcionais precedentes:
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// Pula port e useSSL, especifica apenas timeout
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);Você pode misturar argumentos posicionais e nomeados, mas os argumentos posicionais devem vir primeiro. Argumentos nomeados melhoram a legibilidade, especialmente para métodos com múltiplos parâmetros do mesmo tipo ou sinalizadores (flags) booleanos.
Experimente você mesmo
using System;
using Reports;
class Program
{
public static void Main(string[] args)
{
// Lê os três títulos dos relatórios
string title1 = Console.ReadLine();
string title2 = Console.ReadLine();
string title3 = Console.ReadLine();
// Cria uma instância de ReportGenerator
ReportGenerator generator = new ReportGenerator();
// TODO: Gerar o primeiro relatório - use apenas o título (todos os padrões se aplicam)
// TODO: Gerar o segundo relatório - use o título com includeSummary: true e maxPages: 25
// (pule author e includeHeader, mantendo seus padrões)
// TODO: Gerar o terceiro relatório - use o título com author: "Admin", includeHeader: false e includeSummary: true
// (mantenha o padrão de maxPages)
// Imprime o resultado de cada relatório
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos