Argumentos con nombre
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 49 de 70.
Los argumentos con nombre le permiten especificar qué parámetro recibe un valor utilizando su nombre, en lugar de depender de la posición. Esto hace que las llamadas a los métodos sean más claras y le permite pasar argumentos en cualquier orden.
Usa el nombre del parámetro seguido de dos puntos antes del valor:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// Usando argumentos con nombre
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // Cualquier orden funcionaLos argumentos con nombre destacan cuando se combinan con parámetros opcionales. En lugar de proporcionar todos los valores opcionales precedentes, puedes saltar directamente al que necesites:
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// Omitir port y useSSL, solo especificar timeout
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);Puedes mezclar argumentos posicionales y con nombre, pero los argumentos posicionales deben ir primero. Los argumentos con nombre mejoran la legibilidad, especialmente para métodos con múltiples parámetros del mismo tipo o indicadores booleanos donde el significado no es obvio solo por el valor.
Desafío
FácilVamos a construir un generador de informes que aproveche los argumentos con nombre para que las llamadas a los métodos sean totalmente claras. Cuando los métodos tienen múltiples parámetros, especialmente aquellos del mismo tipo o indicadores booleanos, los argumentos con nombre hacen que tu código sea autodocumentado.
Organizarás tu código en dos archivos:
ReportGenerator.cs: Crea una claseReportGeneratoren el espacio de nombresReportscon un método que tenga varios parámetros opcionales:GenerateReport(string title, string author = "Anonymous", bool includeHeader = true, bool includeSummary = false, int maxPages = 10)- Este método debe devolver una cadena formateada que describa la configuración del informe.
- Formato:
Report: {title} by {author} | Header: {Yes/No}, Summary: {Yes/No}, Max Pages: {maxPages}
Program.cs: En tu archivo principal, demuestra el poder de los argumentos con nombre llamando aGenerateReportde diferentes maneras, omitiendo los parámetros opcionales que no necesites y especificando solo los que importan para cada informe.
Recibirás tres entradas:
- Título del primer informe
- Título del segundo informe
- Título del tercer informe
Genera tres informes con diferentes configuraciones:
- Primer informe: Usa solo el título (se aplican todos los valores predeterminados)
- Segundo informe: Usa el título con
includeSummary: trueymaxPages: 25(omite author e includeHeader, manteniendo sus valores predeterminados) - Tercer informe: Usa el título con
author: "Admin",includeHeader: false, eincludeSummary: true(mantén el valor predeterminado de maxPages)
Imprime el resultado de cada informe en su propia línea.
Por ejemplo, si las entradas son Sales Q1, Annual Review, y Inventory Check, la salida debería 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: 10Observa cómo los argumentos con nombre te permiten saltar directamente a los parámetros que te interesan; no tienes que especificar author o includeHeader solo para cambiar includeSummary. ¡Esto hace que las llamadas a tus métodos sean mucho más legibles y revelen mejor su intención!
Hoja de referencia
Los argumentos con nombre le permiten especificar qué parámetro recibe un valor utilizando su nombre, en lugar de depender de la posición. Esto hace que las llamadas a los métodos sean más claras y permite pasar argumentos en cualquier orden.
Utilice el nombre del parámetro seguido de dos puntos antes del valor:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// Uso de argumentos con nombre
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // Cualquier orden funcionaLos argumentos con nombre funcionan bien con parámetros opcionales. Puede saltar directamente al parámetro que necesite sin proporcionar todos los valores opcionales precedentes:
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// Omitir port y useSSL, especificar solo timeout
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);Puede mezclar argumentos posicionales y con nombre, pero los argumentos posicionales deben ir primero. Los argumentos con nombre mejoran la legibilidad, especialmente para métodos con múltiples parámetros del mismo tipo o indicadores booleanos.
Pruébalo tú mismo
using System;
using Reports;
class Program
{
public static void Main(string[] args)
{
// Lee los tres títulos de los informes
string title1 = Console.ReadLine();
string title2 = Console.ReadLine();
string title3 = Console.ReadLine();
// Crea una instancia de ReportGenerator
ReportGenerator generator = new ReportGenerator();
// TODO: Generar el primer informe - usar solo el título (se aplican todos los valores predeterminados)
// TODO: Generar el segundo informe - usar el título con includeSummary: true y maxPages: 25
// (omitir author e includeHeader, manteniendo sus valores predeterminados)
// TODO: Generar el tercer informe - usar el título con author: "Admin", includeHeader: false, e includeSummary: true
// (mantener el valor predeterminado de maxPages)
// Imprimir el resultado de cada informe
}
}
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