Необязательные параметры
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 48 из 70.
Необязательные параметры позволяют определять значения по умолчанию для параметров метода. Если вызывающая сторона не предоставляет значение для такого параметра, автоматически используется значение по умолчанию.
Вы создаете необязательный параметр, присваивая значение по умолчанию в сигнатуре метода:
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// Оба вызова работают
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!Необязательные параметры должны следовать после всех обязательных параметров. Вы можете использовать несколько необязательных параметров, и вызывающая сторона может опускать любые из них, начиная справа:
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: FalseЗначения по умолчанию должны быть константами времени компиляции — литералами, значениями const или выражениями default. Вы не можете использовать переменные или вызовы методов в качестве значений по умолчанию. Это делает необязательные параметры идеальными для настроек конфигурации и методов, в которых большинство вызывающих сторон используют общие значения.
Задание
ЛегкоДавайте создадим систему уведомлений, которая использует необязательные параметры для обеспечения гибкого форматирования сообщений. Вы создадите вспомогательный класс, который может отправлять уведомления с настраиваемыми параметрами, где большинство вызывающих сторон будут использовать разумные значения по умолчанию.
Вы организуете свой код в двух файлах:
NotificationService.cs: Создайте классNotificationServiceв пространстве именNotificationsс методом, демонстрирующим необязательные параметры:SendNotification(string message, string priority = "Normal", bool addTimestamp = true)— этот метод должен возвращать отформатированную строку уведомления. ЕслиaddTimestampимеет значение true, добавьте к сообщению префикс[TIMESTAMP]. Формат должен быть следующим:[Priority] Messageили[TIMESTAMP] [Priority] Messageв зависимости от настройки временной метки.
Program.cs: В основном файле продемонстрируйте работу необязательных параметров, вызвавSendNotificationтремя разными способами: используя все значения по умолчанию, переопределив один параметр и переопределив оба необязательных параметра.
Вы получите три входных значения:
- Первое сообщение (будут использоваться все значения по умолчанию)
- Второе сообщение (будет использоваться приоритет
"Urgent"с временной меткой по умолчанию) - Третье сообщение (будет использоваться приоритет
"Low"и без временной метки)
Вызовите SendNotification три раза и выведите каждый результат:
- Первый вызов: передайте только первое сообщение (используются значения по умолчанию: приоритет
"Normal", временная метка включена) - Второй вызов: передайте второе сообщение с приоритетом
"Urgent"(временная метка по-прежнему по умолчанию true) - Третий вызов: передайте третье сообщение с приоритетом
"Low"и значениемfalseдля временной метки
Например, если входные данные — System started, Server overload и Cache cleared, вывод должен быть следующим:
[TIMESTAMP] [Normal] System started
[TIMESTAMP] [Urgent] Server overload
[Low] Cache clearedОбратите внимание, как один и тот же метод элегантно обрабатывает все три сценария — вызывающие стороны указывают только то, что им нужно изменить по сравнению со значениями по умолчанию!
Шпаргалка
Необязательные параметры позволяют определять значения по умолчанию для параметров метода. Если вызывающая сторона не предоставляет значение, автоматически используется значение по умолчанию.
Создайте необязательный параметр, присвоив значение по умолчанию в сигнатуре метода:
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// Оба вызова работают
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!Необязательные параметры должны располагаться после всех обязательных параметров. Вы можете использовать несколько необязательных параметров:
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: FalseЗначения по умолчанию должны быть константами времени компиляции — литералами, значениями const или выражениями default. Вы не можете использовать переменные или вызовы методов в качестве значений по умолчанию.
Попробуйте сами
using System;
using Notifications;
class Program
{
public static void Main(string[] args)
{
// Прочитать три сообщения
string message1 = Console.ReadLine();
string message2 = Console.ReadLine();
string message3 = Console.ReadLine();
// Создать экземпляр NotificationService
NotificationService service = new NotificationService();
// TODO: Вызвать SendNotification три раза и вывести каждый результат:
// 1. Первый вызов: передать только message1 (используются все значения по умолчанию)
// 2. Второй вызов: передать message2 с приоритетом "Urgent" (timestamp по умолчанию равен true)
// 3. Третий вызов: передать message3 с приоритетом "Low" и false для timestamp
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов