Parámetros opcionales
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 48 de 70.
Los parámetros opcionales le permiten definir valores predeterminados para los parámetros de los métodos. Cuando un llamador no proporciona un valor para ese parámetro, el valor predeterminado se utiliza automáticamente.
Puedes crear un parámetro opcional asignando un valor predeterminado en la firma del método:
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// Ambas llamadas funcionan
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!Los parámetros opcionales deben aparecer después de todos los parámetros obligatorios. Puedes tener múltiples parámetros opcionales, y quienes realicen la llamada pueden omitir cualquiera desde la derecha:
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: FalseLos valores predeterminados deben ser constantes en tiempo de compilación: literales, valores const o expresiones default. No se pueden utilizar variables ni llamadas a métodos como valores predeterminados. Esto hace que los parámetros opcionales sean ideales para ajustes de configuración y métodos donde la mayoría de los llamadores utilizan valores comunes.
Desafío
FácilVamos a construir un sistema de notificación que utiliza parámetros opcionales para proporcionar un formato de mensaje flexible. Crearás una clase de utilidad que puede enviar notificaciones con configuraciones personalizables, donde la mayoría de los llamadores utilizarán valores predeterminados sensatos.
Organizarás tu código en dos archivos:
NotificationService.cs: Crea una claseNotificationServiceen el espacio de nombresNotificationscon un método que demuestre parámetros opcionales:SendNotification(string message, string priority = "Normal", bool addTimestamp = true)- Este método debe devolver una cadena de notificación formateada. CuandoaddTimestampes true, antepón al mensaje el prefijo[TIMESTAMP]. El formato debe ser:[Priority] Messageo[TIMESTAMP] [Priority] Messagedependiendo de la configuración de la marca de tiempo.
Program.cs: En tu archivo principal, demuestra cómo funcionan los parámetros opcionales llamando aSendNotificationde tres maneras diferentes: usando todos los valores predeterminados, sobrescribiendo un parámetro y sobrescribiendo ambos parámetros opcionales.
Recibirás tres entradas:
- Primer mensaje (usará todos los valores predeterminados)
- Segundo mensaje (usará la prioridad
"Urgent"con la marca de tiempo predeterminada) - Tercer mensaje (usará la prioridad
"Low"y sin marca de tiempo)
Llama a SendNotification tres veces e imprime cada resultado:
- Primera llamada: pasa solo el primer mensaje (usa los valores predeterminados: prioridad
"Normal", marca de tiempo habilitada) - Segunda llamada: pasa el segundo mensaje con la prioridad
"Urgent"(la marca de tiempo sigue siendo true por defecto) - Tercera llamada: pasa el tercer mensaje con la prioridad
"Low"yfalsepara la marca de tiempo
Por ejemplo, si las entradas son System started, Server overload y Cache cleared, la salida debería ser:
[TIMESTAMP] [Normal] System started
[TIMESTAMP] [Urgent] Server overload
[Low] Cache cleared¡Observa cómo el mismo método maneja los tres escenarios de manera elegante: los llamadores solo especifican lo que necesitan cambiar de los valores predeterminados!
Hoja de referencia
Los parámetros opcionales le permiten definir valores predeterminados para los parámetros de un método. Cuando quien realiza la llamada no proporciona un valor, el valor predeterminado se utiliza automáticamente.
Cree un parámetro opcional asignando un valor predeterminado en la firma del método:
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// Ambas llamadas funcionan
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!Los parámetros opcionales deben aparecer después de todos los parámetros obligatorios. Puede tener múltiples parámetros opcionales:
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: FalseLos valores predeterminados deben ser constantes en tiempo de compilación: literales, valores const o expresiones default. No se pueden utilizar variables ni llamadas a métodos como valores predeterminados.
Pruébalo tú mismo
using System;
using Notifications;
class Program
{
public static void Main(string[] args)
{
// Lee los tres mensajes
string message1 = Console.ReadLine();
string message2 = Console.ReadLine();
string message3 = Console.ReadLine();
// Crea una instancia de NotificationService
NotificationService service = new NotificationService();
// TODO: Llama a SendNotification tres veces e imprime cada resultado:
// 1. Primera llamada: pasa solo message1 (usa todos los valores por defecto)
// 2. Segunda llamada: pasa message2 con prioridad "Urgent" (timestamp por defecto es true)
// 3. Tercera llamada: pasa message3 con prioridad "Low" y false para timestamp
}
}
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