Именованные аргументы
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 49 из 70.
Именованные аргументы позволяют указать, какой параметр получает значение, используя его имя, а не полагаясь на позицию. Это делает вызовы методов более понятными и позволяет передавать аргументы в любом порядке.
Используйте имя параметра, за которым следует двоеточие перед значением:
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);Вы можете смешивать позиционные и именованные аргументы, но позиционные аргументы должны идти первыми. Именованные аргументы улучшают читаемость, особенно для методов с несколькими параметрами одного типа или логическими флагами, смысл которых не очевиден из одного только значения.
Задание
ЛегкоДавайте создадим генератор отчетов, который использует именованные аргументы, чтобы сделать вызовы методов предельно ясными. Когда методы имеют несколько параметров — особенно однотипных или логических флагов — именованные аргументы делают ваш код самодокументируемым.
Вы организуете свой код в двух файлах:
ReportGenerator.cs: Создайте классReportGeneratorв пространстве именReportsс методом, имеющим несколько необязательных параметров:GenerateReport(string title, string author = "Anonymous", bool includeHeader = true, bool includeSummary = false, int maxPages = 10)- Этот метод должен возвращать отформатированную строку, описывающую конфигурацию отчета
- Формат:
Report: {title} by {author} | Header: {Yes/No}, Summary: {Yes/No}, Max Pages: {maxPages}
Program.cs: В основном файле продемонстрируйте возможности именованных аргументов, вызываяGenerateReportразными способами — пропуская ненужные необязательные параметры и указывая только те, которые важны для каждого отчета.
Вы получите три входных значения:
- Заголовок первого отчета
- Заголовок второго отчета
- Заголовок третьего отчета
Сгенерируйте три отчета с различными конфигурациями:
- Первый отчет: используйте только заголовок (применяются все значения по умолчанию)
- Второй отчет: используйте заголовок с
includeSummary: trueиmaxPages: 25(пропустите author и includeHeader, сохранив их значения по умолчанию) - Третий отчет: используйте заголовок с
author: "Admin",includeHeader: falseиincludeSummary: true(сохраните значение 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Обратите внимание, как именованные аргументы позволяют вам переходить непосредственно к нужным параметрам — вам не нужно указывать author или includeHeader только для того, чтобы изменить includeSummary. Это делает вызовы ваших методов гораздо более читаемыми и понятными!
Шпаргалка
Именованные аргументы позволяют указать, какой параметр получает значение, используя его имя, а не полагаясь на позицию. Это делает вызовы методов более понятными и позволяет передавать аргументы в любом порядке.
Используйте имя параметра, за которым следует двоеточие перед значением:
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);Вы можете смешивать позиционные и именованные аргументы, но позиционные аргументы должны идти первыми. Именованные аргументы улучшают читаемость, особенно для методов с несколькими параметрами одного типа или логическими флагами.
Попробуйте сами
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'Необязательные параметрыИменованные аргументыПерегрузка методов