C# Ready | Unity
10.1K subscribers
1.2K photos
62 videos
549 links
Авторский канал по разработке на C# и Unity.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

РКН: https://clck.ru/3SBaT3

Реклама на бирже: https://telega.in/c/csharp_ready
Download Telegram
Почему async void почти всегда ошибка?

При работе с асинхронным кодом в C# многие по привычке пишут async void, не задумываясь о последствиях. На первый взгляд всё работает, но такие методы могут привести к трудноуловимым багам.

Разберёмся, в чём проблема и как правильно писать асинхронные методы.

Создадим метод с async void:
async void DoWorkAsync()
{
await Task.Delay(1000);
throw new Exception("Ошибка внутри async void");
}


Вызовем его:
DoWorkAsync();
Console.WriteLine("Метод вызван");


При запуске приложение завершится с ошибкой, и мы не сможем поймать исключение через try/catch.

Теперь перепишем метод правильно — с async Task:
async Task DoWorkAsync()
{
await Task.Delay(1000);
throw new Exception("Ошибка внутри async Task");
}


Вызовем его с обработкой ошибок:
try
{
await DoWorkAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}


Результат в консоли:
Ошибка внутри async Task


🔥 async void нельзя await и в нём невозможно корректно обработать исключения. Используй async Task, а async void оставляй только для обработчиков событий.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥7👍5
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ Смотрите что нашел — Explainshell.

Вводишь любую команду в терминале, и он по частям объясняет, что делает каждая часть. Не просто man-ка, а понятный синтакс-анализ.

Особенно кайф для тех, кто работает в Linux/DevOps/CI среде и хочет разбираться, а не наугад копипастить из StackOverflow.

📌 Оставляю ссылочку: explainshell.com

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥85
👩‍💻 Буферы, которые не засоряют память!

ArrayPool особенно хорош в “горячем” коде, где буферы создаются сотни/тысячи раз: сериализация, парсинг, сетевые пакеты, кодирование строк.

В что важно знать:

Rent() может вернуть массив больше запрошенного;

Return() — всегда (лучше через try/finally);

После Return() массив использовать нельзя; для секретов — clearArray: true


Если у тебя много временных byte[]/char[] — ArrayPool<T> почти всегда даёт профит, но требует дисциплины.

➡️ C# Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥237👍5
📂 Шпаргалка по Core C# и .NET!

На картинке — компактный quick reference по базовым вещам в C#: примитивные типы и их размеры, работа с массивами, частые операции со строками, форматирование чисел и дат, основы регулярных выражений

Сохрани, чтобы под рукой была выжимка для кодинга и ревью.

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍6🔥5
Как не писать Any() перед First()?

Частая привычка — сначала проверить коллекцию, а потом взять первый элемент:
if (items != null && items.Any())
{
var first = items.First();
// ...
}


Проблема в том, что это:

добавляет лишний шум в код,
нередко делает двойной проход по источнику (особенно если это IEnumerable, LINQ-запрос, поток данных),
усложняет чтение: полезная логика прячется за проверками.

Вместо связки Any() + First() обычно достаточно сразу использовать безопасный вариант:
var first = items.FirstOrDefault();
if (first is null) return; // или другой fallback


Если тебе нужно “взять элемент или вернуть дефолт”, это читается как правило и не заставляет выполнять одну и ту же работу дважды.

🔥 Итог: не проверяй Any() перед First() — чаще бери FirstOrDefault() (или SingleOrDefault() для “должен быть один”) и обработай null/default один раз в понятном месте.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍104
😎 Отличная статья — как перестать вручную писать конструкторы и доверить это Source Generator’у.

В этой статье:

• Поймёшь, зачем генерация конструкторов снижает бойлерплейт и ошибки
• Увидишь, как атрибуты описывают зависимости и правила инъекции
• Разберёшь подключение генератора, ограничения, нюансы и реальные кейсы

🔊 Продолжай читать на Habr!


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4🔥2
Lazy<T>: создаём объект только тогда, когда он реально нужен!

Иногда объект создаётся «на всякий случай», хотя по факту используется редко (например, тяжёлый сервис, настройки, конфиг, загрузка файла). В итоге мы тратим время и ресурсы при старте приложения зря.

Lazy<T> решает это просто: объект создаётся только при первом обращении к нему.

Допустим, у нас есть «тяжёлый» объект, который долго создаётся:
class HeavyService
{
public HeavyService()
{
Console.WriteLine("Создаём HeavyService (дорого)...");
// здесь могла бы быть долгая инициализация
}

public string GetData() => "Данные получены";
}


Теперь создадим Lazy<HeavyService>. Обрати внимание: конструктор HeavyService не вызывается сразу:
var lazyService = new Lazy<HeavyService>(() => new HeavyService());
Console.WriteLine("Lazy создан, но сервис ещё не создан");


А теперь впервые обратимся к объекту через .Value — вот тут он и создастся:
Console.WriteLine(lazyService.Value.GetData());


Возможный вывод в консоли:
Lazy создан, но сервис ещё не создан
Создаём HeavyService (дорого)...
Данные получены


🔥 Lazy<T> помогает ускорить старт приложения и не создавать тяжёлые объекты заранее — они появятся только если реально понадобятся.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍229🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ Awesome-Shell — топовая коллекция утилит, скриптов и приёмов для терминала!

Здесь собраны десятки CLI-инструментов, полезные bash/zsh-скрипты, практичные сниппеты и лайфхаки, которые ускоряют работу. Отличный набор для автоматизации, оптимизации и прокачки навыков работы с командной строкой.

Оставляю ссылочку: GitHub 📱


➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥119🤝7👍1
210👍5🔥4
Что же выведет консоль?
Anonymous Quiz
51%
A
10%
B
22%
C
16%
D
8👍7🔥4
👩‍💻 Шпаргалка по Git!

На картинке — компактная карта команд Git, где всё разложено по логике работы: от создания репозитория и просмотра истории до внесения изменений, откатов, обновления из удалённого репо, работы с ветками и публикации результата.

Сохрани, чтобы быстро освежить в памяти нужный шаг, когда Git внезапно “начинает жить своей жизнью”

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥75
Span<T> на пальцах — быстрый доступ к данным без лишних аллокаций!

Часто мы режем строки, копируем массивы, делаем Substring и создаём новые объекты там, где можно обойтись без копирования. Это даёт лишние аллокации и нагрузку на GC.

Span<T> позволяет работать с участком памяти (частью массива/строки) как с “окном”, не создавая новые объекты.

Допустим, у нас есть строка, и мы хотим достать из неё только число:
string text = "User:42;Role:Admin";


Обычно делают так (и это создаёт новую строку):
string idText = text.Substring(5, 2);
int id = int.Parse(idText);
Console.WriteLine(id);


Теперь сделаем то же самое через Span<char> — без Substring:
ReadOnlySpan<char> span = text.AsSpan();

// берём "42" как срез
ReadOnlySpan<char> idSpan = span.Slice(5, 2);

// парсим напрямую из Span
int userId = int.Parse(idSpan);
Console.WriteLine(userId);


Результат:
42


🔥Span<T>ReadOnlySpan<T>) позволяет брать срезы без копирования данных. Это особенно полезно в горячих участках кода: парсинг, обработка строк, сетевые протоколы, высоконагруженные сервисы.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍7🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
✍️ Red Blob Games — полезный сайт для визуального понимания алгоритмов!

Если тебе сложно понять алгоритмы по учебникам — этот ресурс решает проблему. Автор объясняет графы, геометрию, деревья, меши из геймдева через понятные визуализации и интерактивы. Сложные идеи здесь раскладываются на простые шаги.

📌 Оставляю ссылочку: redblobgames.com

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍148🔥6
Как получить уникальные значения без ручных проверок?

Часто нужно убрать дубликаты: имена пользователей, id, теги.
Иногда для этого пишут такую конструкцию:
if (!list.Contains(x))
list.Add(x);


Это работает, но в Contains список просматривается каждый раз — чем больше данных, тем медленнее. Да и выглядит это как “велосипед”.

Гораздо проще (и читабельнее) использовать готовые инструменты:

Для LINQ — Distinct()
Она сама уберёт дубли и вернёт последовательность уникальных значений:
var unique = names.Distinct().ToList();


Для максимальной скорости — `HashSet`
HashSet<T> из коробки хранит только уникальные элементы, без повторов:
var set = new HashSet<string>(names);


🔥 Итог: когда нужны уникальные значения — начинай с Distinct() или HashSet. Меньше ручных проверок, меньше кода, и алгоритм сразу читается как правило: *“здесь храним только уникальные элементы”*.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍98
This media is not supported in your browser
VIEW IN TELEGRAM
❤️ Scrimba — интерактивное обучение программированию!

Если обычные видеоуроки не заходят и хочется больше практики — Scrimba решает эту задачу. Здесь обучение построено так, что ты не просто смотришь объяснение, а сразу работаешь с кодом прямо в уроке: меняешь примеры, запускаешь и смотришь результат. На платформе есть множество языков и технологий.

📌 Оставляю ссылочку: scrimba.com

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍118🔥7
🎄 Всех с наступающим новым 2025 2026 годом!

Поставлю себе цель: набрать более 20 тысяч подписчиков. Желаю каждому выполнить планы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2712👍9
Как сравнивать строки без сюрпризов от локали?

Частая привычка — приводить строки к одному регистру и сравнивать:
a.ToLower() == b.ToLower()


Но это:
делает лишние аллокации (создаёт новые строки),
может зависеть от текущей культуры (локали) и давать неожиданные результаты.

Правильнее — сравнивать строки с явным режимом:
string.Equals(a, b, StringComparison.OrdinalIgnoreCase)


StringComparison.OrdinalIgnoreCase — самый безопасный вариант для технических строк: ключей, логинов, кодов, файлов, заголовков, команд.

А если нужно “по-человечески” (для отображения пользователю) — тогда уместнее CurrentCultureIgnoreCase, но это уже другое правило.

🔥 Итог: меньше аллокаций, предсказуемое сравнение и код, который сразу говорит: “сравниваем без учёта регистра — и точка”.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1711👍7