A Palavra-chave 'params'
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 47 de 70.
A palavra-chave params permite que um método aceite um número variável de argumentos do mesmo tipo. Em vez de exigir que os chamadores criem um array manualmente, eles podem passar argumentos diretamente, separados por vírgulas.
Coloque params antes de um parâmetro de array na assinatura do método:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// Todas essas chamadas funcionam
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (array vazio)O compilador envolve automaticamente os argumentos em um array. Você também pode passar um array existente diretamente se já tiver um:
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60Existem algumas regras a serem lembradas: um método pode ter apenas um parâmetro params e ele deve ser o último parâmetro na lista. Você pode combiná-lo com parâmetros regulares:
public static void Log(string prefix, params object[] items)
{
foreach (var item in items)
Console.WriteLine(prefix + item);
}
Log("Item: ", "Apple", 42, true);A palavra-chave params torna as APIs mais flexíveis e amigáveis para quem as chama, e é por isso que você a vê em métodos como Console.WriteLine e string.Format.
Desafio
FácilVamos construir um formatador de mensagens flexível que utiliza a palavra-chave params para lidar com qualquer número de valores. Você criará uma classe utilitária que pode formatar mensagens com argumentos variáveis, demonstrando como o params torna os métodos mais versáteis e amigáveis para quem os chama.
Você organizará seu código em dois arquivos:
MessageFormatter.cs: Crie uma classeMessageFormatterno namespaceFormattingcom dois métodos que usamparams:Combine(params string[] parts)- junta todas as strings fornecidas com um espaço entre elas e retorna o resultadoFormatList(string label, params int[] numbers)- combina um parâmetro regular com um arrayparams. Ele deve retornar o rótulo seguido por dois pontos, e então todos os números separados por vírgulas (ex:Scores: 85, 90, 78)
Program.cs: No seu arquivo principal, demonstre ambos os métodos com entradas. Leia uma string de rótulo e, em seguida, leia uma linha de números inteiros separados por vírgulas. UseCombinepara juntar três palavras fixas e useFormatListpara exibir o rótulo com os números.
Você receberá duas entradas:
- Uma string de rótulo (ex:
Scores) - Uma lista de números inteiros separados por vírgulas (ex:
85,90,78,92)
Primeiro, chame Combine com as palavras "Hello", "params" e "world!" e imprima o resultado. Em seguida, analise os inteiros separados por vírgulas em um array e chame FormatList com o rótulo e o array de inteiros, imprimindo esse resultado também.
Por exemplo, se as entradas forem Scores e 85,90,78, a saída deve ser:
Hello params world!
Scores: 85, 90, 78Observe como o Combine aceita qualquer número de strings diretamente, enquanto o FormatList mostra que você pode misturar parâmetros regulares com params - o parâmetro params só precisa vir por último. Você também pode passar um array existente para um método params, que é exatamente o que você fará com os inteiros analisados!
Folha de consulta
A palavra-chave params permite que um método aceite um número variável de argumentos do mesmo tipo sem exigir que os chamadores criem um array manualmente:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// Todas estas chamadas funcionam
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (array vazio)Você pode passar um array existente diretamente para um método params:
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60Regras para params:
- Um método pode ter apenas um parâmetro
params - Ele deve ser o último parâmetro na lista
- Pode ser combinado com parâmetros regulares
public static void Log(string prefix, params object[] items)
{
foreach (var item in items)
Console.WriteLine(prefix + item);
}
Log("Item: ", "Apple", 42, true);Experimente você mesmo
using System;
using Formatting;
class Program
{
public static void Main(string[] args)
{
// Lê as entradas
string label = Console.ReadLine();
string numbersInput = Console.ReadLine();
// TODO: Use MessageFormatter.Combine com "Hello", "params", e "world!"
// e imprima o resultado
// TODO: Converta os inteiros separados por vírgula em um array de int
// Dica: Divida a string e converta cada parte para int
// TODO: Use MessageFormatter.FormatList com o label e o array de int
// e imprima o resultado
}
}
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