C# Ready | Unity


Kanal geosi va tili: Rossiya, Ruscha


Авторский канал по разработке на C# и Unity.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!
Автор: @energy_c
РКН: https://clck.ru/3SBaT3
Реклама на бирже: https://telega.in/c/csharp_ready

Зарегистрирован в РКН
Связанные каналы

Kanal geosi va tili
Rossiya, Ruscha
Statistika
Postlar filtri


Собираем автообновление конфига в C#!

Нужно следить за config.json и автоматически перечитывать настройки после изменения файла. Это удобно для сервисов, внутренних тулов и приложений, где часть параметров можно менять без перезапуска.

В этой задаче:
• создаём FileSystemWatcher
• фильтруем события по имени файла
• добавляем короткий debounce


Debounce нужен потому, что одно сохранение файла часто порождает несколько событий подряд. Без небольшой задержки обработчик может попытаться прочитать файл прямо во время записи.

➡️ C# Ready | #задача


Настраиваем JSON-сериализацию через System.Text.Json!

Во многих API нужно отдавать JSON в понятном формате. Часто это camelCase-поля, аккуратные отступы в debug-режиме и отсутствие лишних null-значений.

Для начала подключим пространство имён:

using System.Text.Json;

Создадим простую модель:

record User(int Id, string Name, string? Email);

Теперь заведём настройки сериализации:

var options = new JsonSerializerOptions();

Включим camelCase для имён свойств:

options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

Если JSON нужно читать глазами, включим форматирование:

options.WriteIndented = true;

Теперь сериализуем объект:

var json = JsonSerializer.Serialize(user, options);

Обратно объект можно получить так:

var copy = JsonSerializer.Deserialize(json, options);

Важно не создавать настройки в каждом горячем вызове. Лучше вынести их в статическое поле или общий сервис, чтобы код был единообразным и без лишних аллокаций.

➡️ C# Ready | #практика


Интересная статья про разработку игры на C# без большого движка!

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

В статье автор показывает:
• как думать о game loop и состоянии сцены
• почему полезно понимать основу без готового движка
• какие части игры приходится собирать руками

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


➡️ C# Ready | #статья




Почему ToDictionary может упасть на обычных данных?

Когда нужно быстро превратить список в словарь, часто используют ToDictionary. Это удобно, пока ключи уникальные.

Например, есть список пользователей и нужно быстро искать их по email.
var byEmail = users.ToDictionary(u => u.Email);

Код короткий и читаемый. Но он содержит скрытое предположение, что одинаковых email в списке точно нет.

Если из API, CSV или базы прилетят два пользователя с одним ключом, ToDictionary бросит исключение. Он не может сам решить, какой объект оставить.

Если дубли возможны, сначала нужно явно выбрать правило. Например, оставить первый элемент.
var byEmail = users
.GroupBy(u => u.Email)
.ToDictionary(g => g.Key, g => g.First());

Теперь поведение видно прямо в коде. Мы не случайно теряем данные, а осознанно выбираем первый объект для каждого email.

Если важнее оставить последний элемент, правило тоже должно быть явным.
var byEmail = users
.GroupBy(u => u.Email)
.ToDictionary(g => g.Key, g => g.Last());

А если нужно сохранить все значения одного ключа, лучше использовать ToLookup.
var byEmail = users.ToLookup(u => u.Email);

Lookup похож на словарь, но один ключ может содержать несколько элементов. Это хорошо подходит для тегов, ролей, заказов пользователя и результатов группировки.

Иногда правильнее вообще не чинить дубли в коде, а остановить импорт и показать проблему.
var duplicates = users
.GroupBy(u => u.Email)
.Where(g => g.Count() > 1);

Такой вариант полезен, если email должен быть уникальным по бизнес-правилу. Тогда исключение лучше заменить на понятную ошибку валидации.

Вывод простой. ToDictionary хорош, когда уникальность гарантирована. Если данные приходят извне, сначала реши, что делать с дублями.

В таком случае comparer лучше указать явно.
var byEmail = users
.GroupBy(u => u.Email, StringComparer.OrdinalIgnoreCase)
.ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);

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

Если данные приходят из внешнего источника, полезно сначала нормализовать ключи.
var email = user.Email.Trim().ToLowerInvariant();

Но нормализация тоже должна быть осознанной. Для одних полей это правильно, для других можно случайно сломать смысл значения.

➡️ C# Ready | #совет


Разбираем 7 приёмов для кеширования данных!

MemoryCache помогает держать часто используемые данные рядом с приложением. Это удобно для справочников, настроек, результатов дорогих вычислений и ответов внешних сервисов.

➡️ C# Ready | #шпора


Пишем парсер query string на C#!

Нужно разобрать строку вида ?page=2&tag=cs&tag=api и получить структуру, где повторяющиеся ключи не перетирают друг друга.

В этой задаче:
• убираем лишний вопросительный знак
• делим строку на пары
• декодируем ключи и значения


Такой маленький парсер полезен для CLI-утилит, тестов и логов.

➡️ C# Ready | #задача


Хороший вход в современный C# для начинающих и джунов!

Статья спокойно объясняет, зачем сейчас учить C#, где он применяется и с каких базовых вещей стоит начинать, если хочется двигаться в сторону .NET-разработки.

В статье автор показывает:
• где C# используется в реальных проектах
• какие инструменты нужны на старте
• как подойти к изучению языка без хаоса

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


➡️ C# Ready | #статья


Проверяем срок действия TLS-сертификата!

Нужно быстро понять, когда у сайта закончится HTTPS-сертификат? Соберём простую проверку через openssl: подключимся к серверу, достанем notAfter и посчитаем, сколько дней осталось до истечения.

В этой задаче:
• Получаем сертификат через openssl s_client;
• Достаём дату окончания через openssl x509;
• Считаем разницу и проверяем порог.


Такую проверку удобно запускать в cron, CI или простом мониторинговом скрипте, чтобы не узнать об истёкшем сертификате от пользователей.

➡️ C# Ready | #задача


Почему не стоит lock-ать строку или публичный объект?

В C# lock работает по объекту-синхронизатору:
lock (sync)
{
// критическая секция
}

Проблема начинается, когда в роли sync используют строку:
lock ("cache")
{
UpdateCache();
}

Строки могут интернироваться, то есть одинаковые литералы могут ссылаться на один и тот же объект.

В итоге другой код в приложении тоже может случайно заблокироваться на "cache":
lock ("cache")
{
DoSomethingElse();
}

Похожая проблема с публичными объектами:
public object Sync = new();

Любой внешний код может взять этот объект и тоже сделать lock, создавая странные зависания.

Надёжнее держать приватный синхронизатор:
private readonly object _sync = new();

lock (_sync)
{
UpdateCache();
}

Так точка блокировки остаётся внутри класса, и никто снаружи не может случайно вмешаться.

➡️ C# Ready | #совет


Крутая статья о том, как подружить C#, .NET MAUI и Rust в одном приложении!

В этой статье:
• Как подключить Rust-код к MAUI-проекту
• Зачем может понадобиться нативная часть внутри C#-приложения
• Как C# и Rust могут вместе работать с графикой через SkiaSharp

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


➡️ C# Ready | #статья



12 ta oxirgi post ko‘rsatilgan.