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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/csharp_ready
Download Telegram
📱 UI Events: гибкое управление интерфейсом!

Когда кнопки перестают напрямую ссылаться на игровую логику, интерфейс становится легче перестраивать и переносить между сценами.

В этом посте разбираем:
События освобождают UI от лишних связей и настроек;

Логика реагирует гибко и не зависит от конкретных экранов;

Проект выдерживает изменения без поломок и переработок


Такой способ организации UI делает игру стабильнее, понятнее и легче расширяемой.

➡️ C# Ready | #unity
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
17🔥11👍6🤝3😁1
16👍12🔥5😁2
Быстрые lookup-таблицы с FrozenDictionary в .NET 8!

Когда у тебя есть справочники «один раз создал — тысячу раз читаешь» (коды стран, статусы, типы операций), обычный Dictionary ок, но в .NET 8 можно выжать ещё больше скорости и меньше памяти.

Сначала собираем данные как обычно, затем «замораживаем» словарь:
using System.Collections.Frozen;

var countryCodes = new Dictionary<string, string>
{
["FI"] = "Finland",
["SE"] = "Sweden",
["NO"] = "Norway",
["DK"] = "Denmark",
};

// Один раз преобразуем в FrozenDictionary
var frozenCountryCodes = countryCodes.ToFrozenDictionary();

// Дальше работаем только с frozen-версией
if (frozenCountryCodes.TryGetValue("FI", out var name))
{
Console.WriteLine(name); // Finland
}


FrozenDictionary оптимизирован под частые чтения:
строится один раз при старте,
дальше не изменяется,
lookup обычно быстрее, чем у обычного Dictionary,

Для наборов без значений — то же самое, но через FrozenSet:
using System.Collections.Frozen;

var euCountries = new[] { "FI", "SE", "NO", "DK" }.ToFrozenSet();

if (euCountries.Contains("FI"))
{
Console.WriteLine("EU country");
}


🔥 Главное — если коллекция инициализируется один раз и дальше только читается, переводи её в FrozenDictionary/FrozenSet.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥148👍5
Как сократить цепочки if/else по статусам?

Во многих проектах бизнес-логика по статусам размазана по коду длинными цепочками if/else: для каждого нового состояния появляется ещё один блок, читать и поддерживать это всё становится всё сложнее

Классический вариант быстро разрастается:
string text;

if (status == OrderStatus.New)
text = "Новый заказ";
else if (status == OrderStatus.Paid)
text = "Заказ оплачен";
else
text = "Неизвестный статус";


switch-expression делает то же самое компактным выражением:
var text = status switch
{
OrderStatus.New => "Новый заказ",
OrderStatus.Paid => "Заказ оплачен",
_ => "Неизвестный статус"
};


Такой код легче читать глазами: видно все варианты сразу, проще добавить новый статус и сложнее забыть про default.

🔥 Хорошо заходит для маппинга enum → текст, выбора цвета, типа уведомления или уровня логирования.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
15🔥9👍6
👩‍💻 Файлы без страха и боли!

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

В этом гайде:

Покажем, как аккуратно читать содержимое текстового файла;

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

Поможем перестать бояться путей, ошибок и пустых файлов.


Освоив базовые операции с файлами, ты сделаешь маленькие утилиты гораздо полезнее в повседневных задачах разработки.

➡️ C# Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥168👍3🤝2😁1
Как создавать коллекции без десятка Add?

Во многих местах сначала создаём коллекцию, а потом построчно заполняем её — кода получается больше, чем самих данных:
var ids = new List<int>();
ids.Add(1);
ids.Add(2);
ids.Add(3);

var byId = new Dictionary<int, string>();
byId.Add(1, "Alice");
byId.Add(2, "Bob");


С инициализаторами коллекций данные видно сразу, без шума вокруг:
var ids = new List<int> { 1, 2, 3 };

var byId = new Dictionary<int, string>
{
[1] = "Alice",
[2] = "Bob"
};


🔥 Такой стиль хорошо заходит для константных списков, словарей настроек, маппингов enum → текст и тестовых данных — код читается как набор значений, а не как сценарий заполнения.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥148👍6
👩‍💻 Строим карту длины слов в тексте!

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

В этой задаче:

Превратим сырой набор строк в понятный материал для анализа;

Увидим, как разные слова распределяются по длине и частоте;

Сделаем простую таблицу, которая сразу показывает скрытые закономерности.


И в итоге получим маленький инструмент, который помогает внимательнее смотреть на любой текст.

➡️ C# Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥127👍3👎2🤝2
Удобный System.Text.Json в .NET 8 без Newtonsoft!

Во многих проектах до сих пор тянут Newtonsoft.Json только ради пары фич. В .NET 8 стандартный System.Text.Json уже закрывает большинство кейсов.

Сначала настраиваем опции сериализации и включаем snake_case:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;

var options = new JsonSerializerOptions
{
// Имена свойств в JSON будут в snake_case
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
// Красивый формат для логов/отладки
WriteIndented = true
};


Описываем интерфейс и полиморфные реализации через атрибуты:
// Включаем полиморфную сериализацию по интерфейсу
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
[JsonDerivedType(typeof(CreateUserCommand), typeDiscriminator: "create")]
[JsonDerivedType(typeof(DeleteUserCommand), typeDiscriminator: "delete")]
public interface ICommand { }

public record CreateUserCommand(string UserName) : ICommand;

public record DeleteUserCommand(Guid UserId) : ICommand;


Сериализуем команду в JSON и восстанавливаем обратно в интерфейс:
// Работаем через интерфейс — внутри может быть любая команда
ICommand cmd = new CreateUserCommand("test_user");

// Сериализация с нашими настройками
var json = JsonSerializer.Serialize(cmd, options);
Console.WriteLine(json);

// Десериализация обратно в ICommand
var restored = JsonSerializer.Deserialize<ICommand>(json, options);


🔥 Главное — в .NET 8 System.Text.Json уже умеет удобный snake_case и полиморфную сериализацию по интерфейсам, так что во многих сервисах можно спокойно обходиться без Newtonsoft.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥75
👩‍💻 Асинхронность без лишних сложностей!

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

В этом гайде:

Показываем, как ожидание не мешает выполнению программы;

Объясняем, почему асинхронность делает интерфейс плавнее;

Помогаем понять, где фоновые задачи действительно полезны.


Асинхронность — это способ делать больше без тормозов, сохраняя код простым и понятным.

➡️ C# Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥179👍6🤝2😁1