Parâmetros Opcionais
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 48 de 70.
Parâmetros opcionais permitem que você defina valores padrão para parâmetros de método. Quando um chamador não fornece um valor para esse parâmetro, o padrão é usado automaticamente.
Você cria um parâmetro opcional atribuindo um valor padrão na assinatura do método:
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// Ambas as chamadas funcionam
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!Parâmetros opcionais devem vir após todos os parâmetros obrigatórios. Você pode ter múltiplos parâmetros opcionais, e quem chama pode omitir qualquer um a partir da direita:
public static void CreateUser(string name, int age = 0, bool isActive = true)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
CreateUser("Emma"); // Emma, Age: 0, Active: True
CreateUser("James", 25); // James, Age: 25, Active: True
CreateUser("Sarah", 30, false); // Sarah, Age: 30, Active: FalseValores padrão devem ser constantes de tempo de compilação - literais, valores const ou expressões default. Você não pode usar variáveis ou chamadas de método como padrões. Isso torna os parâmetros opcionais ideais para configurações e métodos onde a maioria dos chamadores usa valores comuns.
Desafio
FácilVamos construir um sistema de notificação que utiliza parâmetros opcionais para fornecer uma formatação de mensagem flexível. Você criará uma classe utilitária que pode enviar notificações com configurações personalizáveis, onde a maioria dos chamadores usará padrões sensatos.
Você organizará seu código em dois arquivos:
NotificationService.cs: Crie uma classeNotificationServiceno namespaceNotificationscom um método que demonstre parâmetros opcionais:SendNotification(string message, string priority = "Normal", bool addTimestamp = true)- Este método deve retornar uma string de notificação formatada. QuandoaddTimestampfor true, prefixe a mensagem com[TIMESTAMP]. O formato deve ser:[Priority] Messageou[TIMESTAMP] [Priority] Messagedependendo da configuração do timestamp.
Program.cs: No seu arquivo principal, demonstre como os parâmetros opcionais funcionam chamandoSendNotificationde três maneiras diferentes - usando todos os padrões, substituindo um parâmetro e substituindo ambos os parâmetros opcionais.
Você receberá três entradas:
- Primeira mensagem (usará todos os valores padrão)
- Segunda mensagem (usará a prioridade
"Urgent"com o timestamp padrão) - Terceira mensagem (usará a prioridade
"Low"e sem timestamp)
Chame SendNotification três vezes e imprima cada resultado:
- Primeira chamada: passe apenas a primeira mensagem (usa os padrões: prioridade
"Normal", timestamp ativado) - Segunda chamada: passe a segunda mensagem com a prioridade
"Urgent"(o timestamp ainda permanece como true por padrão) - Terceira chamada: passe a terceira mensagem com a prioridade
"Low"efalsepara o timestamp
Por exemplo, se as entradas forem System started, Server overload, e Cache cleared, a saída deve ser:
[TIMESTAMP] [Normal] System started
[TIMESTAMP] [Urgent] Server overload
[Low] Cache clearedObserve como o mesmo método lida com todos os três cenários de forma elegante - os chamadores apenas especificam o que precisam alterar em relação aos padrões!
Folha de consulta
Parâmetros opcionais permitem que você defina valores padrão para parâmetros de método. Quando um chamador não fornece um valor, o padrão é usado automaticamente.
Crie um parâmetro opcional atribuindo um valor padrão na assinatura do método:
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// Ambas as chamadas funcionam
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!Parâmetros opcionais devem vir após todos os parâmetros obrigatórios. Você pode ter múltiplos parâmetros opcionais:
public static void CreateUser(string name, int age = 0, bool isActive = true)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
CreateUser("Emma"); // Emma, Age: 0, Active: True
CreateUser("James", 25); // James, Age: 25, Active: True
CreateUser("Sarah", 30, false); // Sarah, Age: 30, Active: FalseValores padrão devem ser constantes de tempo de compilação - literais, valores const ou expressões default. Você não pode usar variáveis ou chamadas de método como padrões.
Experimente você mesmo
using System;
using Notifications;
class Program
{
public static void Main(string[] args)
{
// Lê as três mensagens
string message1 = Console.ReadLine();
string message2 = Console.ReadLine();
string message3 = Console.ReadLine();
// Cria uma instância de NotificationService
NotificationService service = new NotificationService();
// TODO: Chama SendNotification três vezes e imprime cada resultado:
// 1. Primeira chamada: passa apenas message1 (usa todos os padrões)
// 2. Segunda chamada: passa message2 com prioridade "Urgent" (timestamp o padrão é true)
// 3. Terceira chamada: passa message3 com prioridade "Low" e false para timestamp
}
}
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