Menu
Coddy logo textTech

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

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

Вы можете смешивать позиционные и именованные аргументы, но позиционные аргументы должны идти первыми. Именованные аргументы улучшают читаемость, особенно для методов с несколькими параметрами одного типа или логическими флагами, смысл которых не очевиден из одного только значения.

challenge icon

Задание

Легко

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

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

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

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

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

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

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

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

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

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