Menu
Coddy logo textTech

Именованные аргументы

Часть раздела Объектно-ориентированное программирование путешествия по 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 с несколькими параметрами одного типа или логическими флагами, когда их значение само по себе не даёт очевидного понимания.

challenge icon

Задание

Легко

Давайте создадим генератор отчётов, который использует named аргументы, чтобы вызовы method были предельно понятными. Когда у method несколько параметров — особенно параметров одного типа или логических флагов — named аргументы делают код самодокументируемым.

Вы организуете код в двух файлах:

  • ReportGenerator.cs: создайте класс ReportGenerator в namespace Reports с 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 разными способами — пропуская ненужные необязательные параметры и указывая только те, которые важны для каждого отчёта.

Вы получите три входных значения:

  • Заголовок первого отчёта
  • Заголовок второго отчёта
  • Заголовок третьего отчёта

Сгенерируйте три отчёта с разными конфигурациями:

  1. Первый отчёт: используйте только заголовок (применяются все defaults)
  2. Второй отчёт: используйте заголовок с includeSummary: true и maxPages: 25 (пропустите author и includeHeader, сохранив их defaults)
  3. Третий отчёт: используйте заголовок с 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 по умолчанию)
        

        // Вывести результат каждого отчёта
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C#