TGViewer
IRON PROGRAMMER IRON PROGRAMMER @csharp_publics · 3.05K subscribers
Post #2988 943
🚀 C# 13: params больше не только для массивов!

Привет, ребята! 👋

Все вы наверняка знаете что есть у нас курс 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?
Ставь реакцию
👍 знал
👀 не знал
  • 👀 10
  • 🔥 7
  • 👍 6
More from @csharp_publics
  1. Oct 5, 2026Минус 10% на два курса до 31 октября На пути в C# чаще всего буксуют в двух местах. Когда…
  2. Oct 5, 2026😻😻😻 На этом фото видно что Иосиф Витальевич думает о том поздравят ли его ученики с дне…
  3. Oct 3, 2026У меня хобби фоткаться с динозаврами 😂
  4. Oct 2, 2026Наша команда на степиконе. Первый день. Все про ИИ. Слова дня: нейрослоп, иизация. Мне заб…
  5. Oct 1, 2026А еще мы зачислили в новый курс PRO C#. Docker всех учеников профессий "Backend разработчи…
  6. Oct 1, 2026Последние новости Переговоры закончились. Буду писать еще одну книгу. Какую пока не скажу�…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →