Именованные аргументы
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy. Урок 49 из 70.
Named arguments позволяют указать, какой параметр получает значение, используя его имя, вместо того чтобы полагаться на позицию. Это делает вызовы method более понятными и позволяет передавать arguments в любом порядке.
Используй имя параметра, за которым перед значением следует двоеточие:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// Использование именованных аргументов
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // Любой порядок работаетИменованные аргументы особенно полезны в сочетании с необязательными параметрами. Вместо того чтобы указывать все предшествующие необязательные значения, можно сразу перейти к нужному:
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// Пропустить port и useSSL, указать только timeout
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);Можно смешивать позиционные и named arguments, но позиционные аргументы должны идти первыми. named arguments повышают читаемость, особенно для method с несколькими параметрами одного типа или логическими флагами, когда их значение само по себе не даёт очевидного понимания.
Задание
ЛегкоДавайте создадим генератор отчётов, который использует named аргументы, чтобы вызовы method были предельно понятными. Когда у method несколько параметров — особенно параметров одного типа или логических флагов — named аргументы делают код самодокументируемым.
Вы организуете код в двух файлах:
ReportGenerator.cs: создайте классReportGeneratorв namespaceReportsс method, у которого есть несколько необязательных параметров:GenerateReport(string title, string author = "Anonymous", bool includeHeader = true, bool includeSummary = false, int maxPages = 10)- Этот method должен возвращать отформатированную строку с описанием конфигурации отчёта
- Формат:
Report: {title} by {author} | Header: {Yes/No}, Summary: {Yes/No}, Max Pages: {maxPages}
Program.cs: в основном файле продемонстрируйте возможности named аргументов, вызываяGenerateReportразными способами — пропуская ненужные необязательные параметры и указывая только те, которые важны для каждого отчёта.
Вы получите три входных значения:
- Заголовок первого отчёта
- Заголовок второго отчёта
- Заголовок третьего отчёта
Сгенерируйте три отчёта с разными конфигурациями:
- Первый отчёт: используйте только заголовок (применяются все defaults)
- Второй отчёт: используйте заголовок с
includeSummary: trueиmaxPages: 25(пропустите author и includeHeader, сохранив их defaults) - Третий отчёт: используйте заголовок с
author: "Admin",includeHeader: falseиincludeSummary: true(сохраните default для maxPages)
Выведите результат каждого отчёта в отдельной строке.
Например, если входными данными являются Sales Q1, Annual Review и Inventory Check, результат должен быть таким:
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: 10Обратите внимание, как named аргументы позволяют сразу перейти к нужным параметрам — вам не нужно указывать author или includeHeader, чтобы изменить includeSummary. Благодаря этому вызовы method становятся гораздо более понятными и лучше отражают намерение!
Попробуйте сами
using System;
using Reports;
class Program
{
public static void Main(string[] args)
{
// Прочитать три названия отчётов
string title1 = Console.ReadLine();
string title2 = Console.ReadLine();
string title3 = Console.ReadLine();
// Создать экземпляр ReportGenerator
ReportGenerator generator = new ReportGenerator();
// TODO: Сгенерировать первый отчёт — использовать только название (применяются все значения по умолчанию)
// TODO: Сгенерировать второй отчёт — использовать название с includeSummary: true и maxPages: 25
// (пропустить author и includeHeader, сохранив их значения по умолчанию)
// TODO: Сгенерировать третий отчёт — использовать название с author: "Admin", includeHeader: false и includeSummary: true
// (оставить maxPages по умолчанию)
// Вывести результат каждого отчёта
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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'Необязательные параметрыИменованные аргументыПерегрузка методовПотренируйтесь самостоятельно: Онлайн-компилятор C#