Привет, ребята! 👋
Все вы наверняка знаете что есть у нас курс PRO C#. Эволюция языка, ну теперь точно знаете.
И в этом курсе у нас представлены нововведения языка вплоть до 12 версии.
Решили немного освежить ваши знания и начать серию публикаций на тему дальнейших нововведений.
#полезные_материалы@csharp_publics
Итак, новость из мира .NET 9 / C# 13.
Было
До C# 13 ключевое слово
params работало только с массивами:void Sum(params int[] numbers) { }
Sum(1, 2, 3); // ОК
Sum(new List<int> {1, 2, 3}); // Не подойдёт напрямуюХотел передать
List, Span или другую коллекцию «как есть»? Приходилось конвертировать в массив. Лишние аллокации, лишний код Стало в C# 13
Теперь params умеет работать с любыми подходящими коллекциями:
✅
List<T>✅
Span<T> / ReadOnlySpan<T>✅ Любые типы, реализующие
IEnumerable<T> + имеющие метод Add✅ Интерфейсы:
IEnumerable<T>, IList<T>, ICollection<T> и другие// Теперь так можно
void Sum(params List<int> numbers) { }
Sum(1, 2, 3); // Компилятор сам создаст List
Sum(new List<int> {1, 2, 3}); // Передаём готовый список
// Даже со Span работает!
void Print(params ReadOnlySpan<string> items)
{
foreach (var item in items)
Console.Write(item + " ");
}
Print("Hello", "C#", "13"); // Hello C# 13
💡 Зачем это нужно?
🔹 Меньше аллокаций — не нужно создавать массив «на лету»
🔹 Гибче — принимай те коллекции, которые удобны тебе
🔹 Чище код — меньше конвертаций, больше читаемости
🔹 Производительность — особенно с
Span<T> в высоконагруженных сценариях⚠️ Важный нюанс
Если ты указываешь интерфейс (например,
IEnumerable<T>), компилятор сам создаст хранилище для переданных аргументов. Это удобно, но помни о небольших накладных расходах при множественных вызовах.🎯 Пример из жизни
// Было (до C# 13)
void Log(params string[] messages) { }
// Стало (C# 13)
void Log(params List<string> messages) { }
// или даже
void Log(params IEnumerable<string> messages) { }
// Вызовы — те же самые!
Log("Start", "Processing", "Done");
Один и тот же вызов — но теперь ты свободен в выборе внутренней реализации 🎉
🔗 Хочешь глубже?
Читай спецификацию: Params collections in C# 13
А ты знал про это фичу C# 13?
Ставь реакцию
👍 знал
👀 не знал