La palabra clave 'params'
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 47 de 70.
La palabra clave params permite que un método acepte un número variable de argumentos del mismo tipo. En lugar de requerir que quienes llaman al método creen un array manualmente, pueden pasar los argumentos directamente, separados por comas.
Coloque params antes de un parámetro de array en la firma del método:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// Todas estas llamadas funcionan
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (arreglo vacío)El compilador envuelve automáticamente los argumentos en un array. También puedes pasar un array existente directamente si ya tienes uno:
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60Hay algunas reglas que recordar: un método puede tener solo un parámetro params, y debe ser el último parámetro de la lista. Puedes combinarlo con 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);La palabra clave params hace que las APIs sean más flexibles y fáciles de usar para quien las llama, razón por la cual se ve en métodos como Console.WriteLine y string.Format.
Desafío
FácilVamos a construir un formateador de mensajes flexible que utiliza la palabra clave params para manejar cualquier cantidad de valores. Crearás una clase de utilidad que puede formatear mensajes con argumentos variables, demostrando cómo params hace que los métodos sean más versátiles y fáciles de usar para quien los llama.
Organizarás tu código en dos archivos:
MessageFormatter.cs: Crea una claseMessageFormatteren el espacio de nombresFormattingcon dos métodos que utilicenparams:Combine(params string[] parts)- une todas las cadenas proporcionadas con un espacio entre ellas y devuelve el resultado.FormatList(string label, params int[] numbers)- combina un parámetro regular con un arrayparams. Debe devolver la etiqueta seguida de dos puntos, luego todos los números separados por comas (por ejemplo,Scores: 85, 90, 78).
Program.cs: En tu archivo principal, demuestra ambos métodos con entradas. Lee una cadena para la etiqueta, luego lee una línea de enteros separados por comas. UsaCombinepara unir tres palabras fijas, y usaFormatListpara mostrar la etiqueta con los números.
Recibirás dos entradas:
- Una cadena de etiqueta (por ejemplo,
Scores) - Una lista de enteros separados por comas (por ejemplo,
85,90,78,92)
Primero, llama a Combine con las palabras "Hello", "params", y "world!" e imprime el resultado. Luego, analiza los enteros separados por comas en un array y llama a FormatList con la etiqueta y el array de enteros, imprimiendo también ese resultado.
Por ejemplo, si las entradas son Scores y 85,90,78, la salida debería ser:
Hello params world!
Scores: 85, 90, 78Observa cómo Combine acepta cualquier número de cadenas directamente, mientras que FormatList muestra que puedes mezclar parámetros regulares con params; el parámetro params simplemente debe ir al final. ¡También puedes pasar un array existente a un método params, que es exactamente lo que harás con los enteros analizados!
Hoja de referencia
La palabra clave params permite que un método acepte un número variable de argumentos del mismo tipo sin requerir que los llamadores creen un array manualmente:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// All of these calls work
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (empty array)Puedes pasar un array existente directamente a un método params:
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60Reglas para params:
- Un método solo puede tener un parámetro
params - Debe ser el último parámetro en la lista
- Se puede combinar con 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);Pruébalo tú mismo
using System;
using Formatting;
class Program
{
public static void Main(string[] args)
{
// Leer las entradas
string label = Console.ReadLine();
string numbersInput = Console.ReadLine();
// TODO: Usa MessageFormatter.Combine con "Hello", "params" y "world!"
// e imprime el resultado
// TODO: Convierte los enteros separados por comas en un array de int
// Pista: Divide la cadena y convierte cada parte a int
// TODO: Usa MessageFormatter.FormatList con el label y el array de int
// e imprime el resultado
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes9Argumentos variables
La palabra clave 'params'Parámetros opcionalesArgumentos con nombreSobrecarga de métodos