Ключевое слово '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.
Задание
ЛегкоДавайте создадим гибкий форматировщик сообщений, который использует ключевое слово 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
// и выведите результат
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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'Необязательные параметрыИменованные аргументыПерегрузка методов