9818
Авторский канал по разработке на C# и Unity. Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_it РКН: https://clck.ru/3SBaT3 Реклама на бирже: https://telega.in/c/csharp_ready
Эффективная отмена операций с CancellationToken!
Часто нужно прерывать долгие операции по таймауту или по внешнему сигналу — как сделать это просто и гибко?
Сначала создаём источник с таймаутом:
var ctsTimeout = new CancellationTokenSource();
ctsTimeout.CancelAfter(TimeSpan.FromSeconds(5));
var timeoutToken = ctsTimeout.Token;
var ctsExternal = new CancellationTokenSource();
using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(
timeoutToken, ctsExternal.Token);
await SomeLongOperationAsync(linkedCts.Token);
Как работать с многострочными строками без «+» и «\n»?
При вставке длинных SQL, JSON или других текстовых фрагментов код засоряется экранированием и конкатенациями, из-за чего теряется читаемость и становится сложнее вносить правки.
До C# 11 приходилось писать так:
var sql = "SELECT Id, Name\n" +
"FROM Users\n" +
"WHERE Name LIKE '%Иван%'";
var sql = """
SELECT Id, Name
FROM Users
WHERE Name LIKE '%Иван%'
""";
SQL, JSON, XML и любые другие большие тексты без экранирования и конкатенаций — код чище и понятнее.
Лайфхак для target-typed new!
С C# 9 вы можете упростить создание объектов, позволяя компилятору выводить тип из контекста:
List<string> names = new() { "Alice", "Bob", "Charlie" };
Dictionary<int, string> map = new()
{
[1] = "One",
[2] = "Two"
};void PrintPerson(Person p) => Console.WriteLine(p.Name);
PrintPerson(new("Иван"));
new("Иван") создаёт Person:class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}
new("…") там, где ожидается Person.
👩💻 Разбираем кортежи и деконструкции!В этой шпаргалке — разбор кортежей и деконструкции в C#: как легко группировать данные без создания классов, обращаться к элементам по имени и распаковывать значения в переменные. Они упрощают работу с данными, делая код выразительным и лаконичным.
➡️ C# Ready | #шпора
Форматирование кода и единый стиль с dotnet format и EditorConfig!
Узнаем, как настроить единый стиль кодирования в проекте и автоматически форматировать всё одним инструментом — без лишних правок вручную.
Для начала создадим файл настроек стиля в корне проекта:
# .editorconfig
root = true
[*.cs]
indent_style = space
indent_size = 4
insert_final_newline = true
dotnet_sort_system_directives_first = true
csharp_new_line_before_open_brace = all
dotnet-format (если ещё не установлен):dotnet tool install -g dotnet-format
cd MySolution
dotnet format
Formatting code in workspace 'MySolution.sln'...
Applying C# conventions...
Formatted document 'Program.cs'
Formatted document 'Controllers/HomeController.cs'
Formatting completed in 1.23 sec
dotnet format применяет правила из .editorconfig ко всему решению — экономит часы на ручных правках и гарантирует единый стиль у всей команды
👩💻 Мгновенное кэширование вычислений при помощи MemoryCache!
Храня результат тяжёлой функции в памяти, приложение отвечает мгновенно при повторных запросах, снижая нагрузку и ускоряя ответ без лишних вычислений.
В этой задаче:
• Придаёт скорости повторяющимся операциям в консоли на каждом запуске;
• Избегает ненужных пауз в работе программы автоматически;
• Контролирует время жизни данных без ручных действий.
MemoryCache — простой способ бесшовно ускорить приложение и значительно снизить нагрузку на вычисления.
👩💻 Разбираем readonly struct — как запретить изменения без лишних затрат?
Этот тип фиксирует все значения на этапе создания и исключает любые дальнейшие изменения.
Что важно знать:
• Нельзя менять поля;
• Нет скрытых действий;
• Меньше ошибок в коде.
👩💻 Console вывод без границ!Освой ключевые методы для текстовых интерфейсов. Пиши ярко, читай гибко, управляй курсором и цветами как настоящий профи в C# приложениях.
➡️ C# Ready | #шпора
👩💻 Мгновенный аплоад в Google Drive!
С помощью пары методов перенесите любой файл на диск, получив мгновенную ссылку для удобного просмотра.
Что важно знать:
• Файл доступа рядом;
• Доступ только нужный;
• Большие файлы делим.
📱 Async/await против корутин в Unity!
Кратко сравниваем задачи C# и корутины Unity, показывая, где каждая техника эффективнее в реальных сценариях.
Что важно знать:
• Ошибки ловятся сразу;
• Отмена делается просто;
• Изображение остаётся плавным.
👩💻 Кортежи без классов и аллокаций!
В прошлый раз говорили про деконструкцию и производительность. ValueTuple хорошо ложится в методы, паттерны и цепочки
Что важно знать:
• Упрощает возврат значений;
• Работает с LINQ;
• Имеет имена полей.
Поиск текста во всех файлах папки!
Нужно найти слово или строку в десятках файлов? Например, проверить, где используется "connectionString" в .cs, .json или других файлах.
Укажем путь к папке и ключевое слово:
string folderPath = @"C:\Projects\Config";
string searchTerm = "connectionString";
foreach (var file in Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories))
{
string content = File.ReadAllText(file);
if (content.Contains(searchTerm, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine($"Найдено в: {file}");
}}
.cs и .json до .txt. Можно адаптировать под поиск по маске (*.log) или включить регулярные выражения.
📱 Разбираем DrawMeshInstanced — быстрый рендер тысяч одинаковых объектов!
Он позволяет отрисовать до 1023 копии меша за один вызов без лишних объектов и Update'ов.
Что важно знать:
• Один вызов отрисовывает сразу сотни копий меша;
• Не создаёт объектов и не тратит ресурсы CPU;
• Позволяет задавать цвет, масштаб и позицию каждой копии.
👩💻 Сегодня создаем QR-код для подключения к Wi-Fi без ввода пароля!
Готовим картинку, которая подключит к сети без ввода пароля.
Что важно знать:
• Строка Wi-Fi формируется специальным генератором из библиотеки;
• QR-код сохраняется как обычное изображение в формате PNG;
• Работает на большинстве телефонов без дополнительных приложений.
👩💻 Удобная параллельность с TPL
Библиотека упрощает управление параллельными операциями, автоматизируя планирование и обработку ошибок.
Что важно знать:
• Задачи выполняются одновременно без сложной настройки потоков;
• Можно легко отменять задачи и обрабатывать возникающие ошибки;
• Работа равномерно распределяется по всем доступным ядрам процессора.
👩💻 Погружаемся в мир глобализации с CultureInfo!В этой шпаргалке вы узнаете, как грамотно управлять культурными настройками приложения: менять формат дат и чисел под привычки пользователя, использовать инвариантные форматы для надёжной сериализации, обращаться к кешированным объектам по коду языка и на лету адаптировать шаблоны вывода
➡️ C# Ready | #шпора
👩💻 Когда консоль превращается в игровое поле!
В простом окне терминала рождается динамика стратегии — всего девять клеток, но достаточно, чтобы почувствовать азарт и победу в чистом виде.
В этой задаче:
• Показывает, как из обычного ввода сделать живую механику;
• Учит коду реагировать на игрока, как на событие;
• Демонстрирует, что даже консоль может быть интерактивной.
📱 Input System: одно действие — любое устройство!
Меняя схему управления один раз, ты получаешь плавный переход между клавиатурой, геймпадом и любым новым контроллером без лишних правок в коде.
В этом гайде:
• Экономим время на настройку разных кнопок сразу;
• Упрощаем добавление новых контроллеров без переработки логики;
• Делаем игру доступной широкому числу игроков мгновенно.
👩💻 ASCII‑арт в консоли: ретро‑магия символов
Превращаем любые изображения в консольную графику через простую мэппинг‑палитру и масштабирование — без лишних библиотек, сложных настроек и громоздкого кода, быстро.
В этой задаче:
• Добавить глубину и стиль консольной графике символами;
• Легко менять палитры символов под любой визуальный эффект;
• Получать ASCII‑арт одной командой без сложных параметров.
👩💻 Мгновенный DNS-контроль!Преобразуй домены в IP-адреса и обратно за одно мгновение, запускай асинхронные запросы без блокировок, узнавай имя хоста и веди кристально-точные логи — всё под полной властью твоего кода, без лишних аллокаций и пауз.
➡️ C# Ready | #шпора
💅 The Complete Tutorial — базовый курс C# в виде коротких статей!
Простой, линейный курс: переменные, классы, коллекции, LINQ, файлы, XML, регулярки, рефлексия. Читается быстро, есть переводы (в т.ч. русский) и PDF-версия.
📌 Оставляю ссылочку: csharp.net-tutorials
➡ C# Ready | #ресурс
ТОП 3 канала для тех, кто увлекается хакингом и кибербезопасностью
Этичный Хакер — крупнейший в СНГ канал по информационной безопасности. OSINT, анонимность, пентест, социальная инженерия.
Лаборатория Хакера — авторский канал от специалиста по ИБ. Новости даркнета, сетевая разведка, обзоры инструментов с github, полезные подборки.
Mr.Robot — OSINT, анонимность, OWASP, Linux, даркнет.
Отслеживаем изменения в папке через FileSystemWatcher — мгновенный отклик без опроса!
Иногда нужно сразу реагировать, когда в каталоге появляется новый файл отчёта или изменяется конфигурация. Вместо бесконечных таймеров используем встроенный наблюдатель файловой системы.
Сначала задаём путь и настраиваем watcher: реагируем на создание и изменение только .txt-файлов, подписываемся на события Created и Changed:
using System.IO;
string path = @"C:\Watched";
using var watcher = new FileSystemWatcher(path, "*.txt")
{
NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite,
IncludeSubdirectories = false,
// или true — если нужны подпапки
EnableRaisingEvents = true
// запускаем слежение
};
watcher.Created += OnChanged;
watcher.Changed += OnChanged;
static void OnChanged(object sender, FileSystemEventArgs e)
{
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {e.ChangeType}: {e.FullPath}");
}
Console.WriteLine($"👀 Слежение за {path} запущено. Нажмите Enter для выхода…");
Console.ReadLine();FileSystemWatcher избавляет от циклов опроса: оперативно, без лишних ресурсов и под любые типы файлов.
Параллельная обработка коллекции через Parallel.ForEach!
Когда нужно быстро выполнить CPU-интенсивную работу над большим набором данных, можно распараллелить обработку без сложной ручной работы с потоками:
// Исходная коллекция—скажем, список чисел
var numbers = new int[1_000_000];
new Random().NextBytes(new Span<byte>(new byte[0])); // просто для примера
for (int i = 0; i < numbers.Length; i++)
numbers[i] = i;
Parallel.ForEach, соберём результаты в потокобезопасную коллекцию и зададим максимальное число параллельных задач:var results = new ConcurrentBag<int>();
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount };
Parallel.ForEach(numbers, options, number =>
{
// эмуляция тяжёлой работы
int squared = number * number;
results.Add(squared);
});
ConcurrentBag<T> гарантирует, что в него можно безопасно записывать из разных потоков без блокировок:Console.WriteLine($"Обработано элементов: {results.Count}");
Console.WriteLine($"Первый результат: {results.Min()} | Последний: {results.Max()}");MaxDegreeOfParallelism — на некоторых задачах меньшее число потоков даёт лучшее быстродействие за счёт меньшего оверхеда переключений.
ValueTask vs Task — когда можно обойтись без лишних аллокаций!
Иногда асинхронный метод чаще всего завершается синхронно, а возвращая Task, мы платим за каждую аллокацию объекта-представителя:
// «До»: всегда возвращаем Task, даже если результат готов сразу
public async Task<int> GetCountAsync()
{
if (cache.TryGetValue("count", out var value))
return value;
var fresh = await LoadCountFromDbAsync();
cache["count"] = fresh;
return fresh;
}
Task-объект:// «После»: возвращаем ValueTask при готовом результате
public ValueTask<int> GetCountAsync()
{
if (cache.TryGetValue("count", out var value))
return new ValueTask<int>(value); // без аллокации state-machine
return new ValueTask<int>(LoadCountFromDbAsync());
}
cache hit мы сразу упаковываем значение в ValueTask<int>, не создавая асинхронной машины состояний.ValueTask, обёрнутый вокруг реального Task.ValueTask там, где результат часто готов сразу, сокращает количество выделений в куче и снижает нагрузку сборщика мусора.
👩💻 Как запускать действия по времени?Если нужно, чтобы что-то происходило регулярно — этот класс справится. Работает стабильно, не грузит систему и подходит даже тем, кто не дружит с потоками.
➡️ C# Ready | #шпора
Копируем только нужные файлы — быстро и удобно!
Нужно забрать только .jpg, .csv или любые другие файлы из папки? Не перебираем вручную — всё делаем в пару строк на C#.
Указываем директории и фильтр по расширению:
string sourceDir = @"C:\Data\Images";
string destDir = @"C:\Backup\Images";
string extension = ".jpg";
foreach (var file in Directory.GetFiles(sourceDir))
{
if (Path.GetExtension(file).Equals(extension, StringComparison.OrdinalIgnoreCase))
{
var destFile = Path.Combine(destDir, Path.GetFileName(file));
File.Copy(file, destFile, overwrite: true);
}
}
.jpg (или любых других) из каталога — идеально для бэкапа, фильтрации или миграции данных.
👩💻 Stopwatch — простой и точный способ измерить производительность любого участка кода в .NETОн помогает отследить длительность операций с миллисекундной точностью, запускать и перезапускать замеры, профилировать и оптимизировать выполнение без лишнего шума.
➡️ C# Ready | #шпора
Упаковываем папку в ZIP одним методом — быстро и надёжно!
Иногда нужно отправить отчёты коллегам или сохранить бэкап: идеальный вариант — запаковать директорию одним вызовом.
Сначала подключим нужное пространство имён и зададим исходную папку и путь к будущему архиву:
using System.IO.Compression;
string sourceDir = @"C:\Reports";
string zipPath = @"C:\Archives\Reports_2025-09-28.zip";
ZipFile.CreateFromDirectory(
sourceDir,
zipPath,
CompressionLevel.SmallestSize,
includeBaseDirectory: false);
Console.WriteLine($"📦 Архив создан: {zipPath}");
Оцени 7 причин пройти бесплатный интенсив по Frontend-разработке:
1. Ты с нуля сделаешь фронтенд-проект;
2. Сверстаешь веб-сайт на HTML + CSS;
3. Оживишь страницу с помощью JavaScript;
4. Получишь советы по доработке от куратора;
5. Зальёшь рабочий сайт в интернет;
6. Поймёшь, как упростить работу с помощью ChatGPT и Giga;
7. Начнёшь зарабатывать на вёрстке в течение месяца 🔥
А главное, ты проведёшь 7 дней в приятной компании Fullstack-разработчика с 12-летним стажем – Романа Чернова.
⏳ 25 сентября закроется регистрация на текущий поток.
👉 Забирай курс — и начни зарабатывать на вёрстке от 100 000₽ в месяц
🔥 С нас обучение, практика и помощь с выходом на фриланс или собеседованием.