Menu
Coddy logo textTech

Ключевое слово 'params'

Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 47 из 70.

Ключевое слово params позволяет методу принимать переменное количество аргументов одного и того же типа. Вместо того чтобы требовать от вызывающей стороны создания массива вручную, они могут передавать аргументы напрямую, разделяя их запятыми.

Поместите params перед параметром массива в сигнатуре метода:

public static int Sum(params int[] numbers)
{
    int total = 0;
    foreach (int n in numbers)
        total += n;
    return total;
}

// Все эти вызовы работают
Console.WriteLine(Sum(1, 2));           // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5));  // 15
Console.WriteLine(Sum());               // 0 (пустой массив)

Компилятор автоматически упаковывает аргументы в массив. Вы также можете передать существующий массив напрямую, если он у вас уже есть:

int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values));  // 60

Нужно помнить несколько правил: метод может иметь только один параметр params, и он должен быть последним параметром в списке. Вы можете комбинировать его с обычными параметрами:

public static void Log(string prefix, params object[] items)
{
    foreach (var item in items)
        Console.WriteLine(prefix + item);
}

Log("Item: ", "Apple", 42, true);

Ключевое слово params делает API более гибкими и удобными для вызова, поэтому оно используется в таких методах, как Console.WriteLine и string.Format.

challenge icon

Задание

Легко

Давайте создадим гибкий форматировщик сообщений, который использует ключевое слово params для обработки любого количества значений. Вы создадите вспомогательный класс, который может форматировать сообщения с переменным количеством аргументов, демонстрируя, как params делает методы более универсальными и удобными для вызова.

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

  • MessageFormatter.cs: Создайте класс MessageFormatter в пространстве имен Formatting с двумя методами, использующими params:
    • Combine(params string[] parts) — объединяет все предоставленные строки пробелом между ними и возвращает результат.
    • FormatList(string label, params int[] numbers) — объединяет обычный параметр с массивом params. Он должен возвращать метку, за которой следует двоеточие, а затем все числа, разделенные запятыми (например, Scores: 85, 90, 78).
  • Program.cs: В основном файле продемонстрируйте работу обоих методов с входными данными. Считайте строку метки, затем считайте строку целых чисел, разделенных запятыми. Используйте Combine для объединения трех фиксированных слов и используйте FormatList для отображения метки с числами.

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

  • Строка метки (например, Scores)
  • Список целых чисел, разделенных запятыми (например, 85,90,78,92)

Сначала вызовите Combine со словами "Hello", "params" и "world!" и выведите результат. Затем преобразуйте разделенные запятыми целые числа в массив и вызовите FormatList с меткой и массивом целых чисел, также выведя этот результат.

Например, если входные данные — Scores и 85,90,78, вывод должен быть следующим:

Hello params world!
Scores: 85, 90, 78

Обратите внимание, как Combine принимает любое количество строк напрямую, в то время как FormatList показывает, что вы можете смешивать обычные параметры с params — параметр params просто должен идти последним. Вы также можете передать существующий массив в метод с params, что вы и сделаете с обработанными целыми числами!

Шпаргалка

Ключевое слово params позволяет методу принимать переменное количество аргументов одного и того же типа, не требуя от вызывающей стороны ручного создания массива:

public static int Sum(params int[] numbers)
{
    int total = 0;
    foreach (int n in numbers)
        total += n;
    return total;
}

// All of these calls work
Console.WriteLine(Sum(1, 2));           // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5));  // 15
Console.WriteLine(Sum());               // 0 (empty array)

Вы можете передать существующий массив напрямую в метод с params:

int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values));  // 60

Правила для params:

  • Метод может иметь только один параметр params
  • Он должен быть последним параметром в списке
  • Может сочетаться с обычными параметрами
public static void Log(string prefix, params object[] items)
{
    foreach (var item in items)
        Console.WriteLine(prefix + item);
}

Log("Item: ", "Apple", 42, true);

Попробуйте сами

using System;
using Formatting;

class Program
{
    public static void Main(string[] args)
    {
        // Чтение входных данных
        string label = Console.ReadLine();
        string numbersInput = Console.ReadLine();
        
        // TODO: Используйте MessageFormatter.Combine с "Hello", "params" и "world!"
        // и выведите результат
        
        
        // TODO: Преобразуйте целые числа, разделенные запятыми, в массив int
        // Подсказка: Разделите строку и преобразуйте каждую часть в int
        
        
        // TODO: Используйте MessageFormatter.FormatList с label и массивом int
        // и выведите результат
        
    }
}
quiz iconПроверьте себя

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

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