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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/csharp_ready
Download Telegram
👩‍💻 Генерация фейковых пользователей с Bogus!

Небольшая консольная утилита, которая создаёт список тестовых пользователей: ID, полное имя, email, телефон и дату рождения — на основе библиотеки Bogus.

В этой задаче:
Создаём консольный проект на C# и подключаем библиотеку Bogus.

Генерируем список пользователей с реалистичными данными и локализацией.

Выводим результат в удобном табличном формате.


Это позволяет быстро наполнять проекты реалистичными тестовыми данными, гибко настраивать формат и локализацию.

➡️ C# Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍7🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
😎 Lucidchart — платформа для построения диаграмм, моделирования процессов и визуализации архитектуры!

Позволяет формализовать и наглядно представить сложные системы: от backend-архитектуры и UML-диаграмм до бизнес-процессов и пользовательских сценариев. Поддерживает совместную работу, интеграции с корпоративными сервисами и автоматизацию создания схем. Подходит для проектирования, технической документации и коммуникации внутри команд.

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍134🔥4
Почему ContainsKey() перед индексатором часто лишний?

Часто со словарём работают так:
if (users.ContainsKey(id))
{
var user = users[id];
}


Код выглядит логично: сначала проверили ключ, потом достали значение.

Но в таком варианте словарь ищет ключ два раза.
Первый раз — в ContainsKey(), второй — при обращении через индексатор.

Если нужно сразу получить значение, лучше использовать:
if (users.TryGetValue(id, out var user))
{
// используем user
}


TryGetValue() за один вызов проверяет ключ и возвращает значение.

🔥 Если тебе нужно значение из словаря, TryGetValue() обычно лучше, чем ContainsKey() + индексатор.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍11🔥3
👍Камера и AI прямо в MAUI!

В этой статье:
• Получаем кадры с камеры без лишних задержек.
• Запускаем распознавание лиц через MediaPipe Tasks.
• Рисуем оверлеи поверх живого изображения.

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


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍43
This media is not supported in your browser
VIEW IN TELEGRAM
✍️ Godot + C# — основы разработки игр на C#!

Подробная документация по работе с C# в Godot 4: настройка проекта, структура скриптов, классы, сцены, сигналы и взаимодействие объектов внутри движка. Материал отлично подойдёт тем, кто хочет разрабатывать игры на Godot, используя привычный стек C# и .NET вместо GDScript. В документации много примеров кода и практических объяснений.

📌 Оставляю ссылочку: docs.godotengine.org

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥7👍4
Почему IEnumerable лучше не перечислять несколько раз?

IEnumerable<T> выглядит как обычная коллекция, но это может быть не список.

Это может быть LINQ-запрос, чтение из файла, генератор или результат из базы.

Например:
if (orders.Count() > 0)
{
foreach (var order in orders)
Process(order);
}


На первый взгляд код нормальный.

Но Count() может пройти всю последовательность.
А потом foreach пройдёт её ещё раз.

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

Если нужен повторный доступ, лучше явно сохранить данные:
var orderList = orders.ToList();


А если нужен только проход — не делай лишнюю проверку перед foreach.

🔥 IEnumerable<T> — это не всегда коллекция в памяти. Иногда это инструкция, как получить данные.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥73👍3
📂 Напоминалка по Rate Limiting!

Например, Token Bucket отлично подходит для API с кратковременными burst-нагрузками, а Leaky Bucket помогает выравнивать поток запросов и защищать сервис от перегрузки.

На картинке — 5 популярных стратегий ограничения запросов, которые стоит знать каждому backend-разработчику.

Сохрани, чтобы не потерять!

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93🔥2👎1
Guard: создаём свои проверки аргументов

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

Часто такие проверки пишут прямо внутри метода:
void CreateUser(string email)
{
if (string.IsNullOrWhiteSpace(email))
throw new ArgumentException("Email is empty");

Console.WriteLine($"User created: {email}");
}


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

В C# можно вынести такие проверки в небольшой helper и сделать код чище:
public static class Guard
{
public static string NotEmpty(string value, string name)
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentException($"{name} is empty");

return value;
}
}


Теперь проверку можно использовать в любом месте:
void CreateUser(string email)
{
email = Guard.NotEmpty(email, nameof(email));

Console.WriteLine($"User created: {email}");
}


Метод NotEmpty сразу делает две вещи: проверяет значение и возвращает его обратно, если всё нормально.

Такой подход особенно удобен, когда в проекте много входных параметров, DTO, команд или сервисных методов. Вместо копирования одинаковых if ты собираешь проверки в одном месте.

Можно сделать вариант ещё удобнее — через extension method:
public static class GuardExtensions
{
public static string NotEmpty(this string value, string name)
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentException($"{name} is empty");

return value;
}
}


И тогда код становится короче:
void CreateUser(string email)
{
email = email.NotEmpty(nameof(email));

Console.WriteLine($"User created: {email}");
}


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

🔥 Guard — это способ не размазывать одинаковую валидацию по всему проекту.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥3👍2
7🔥4👍2
👩‍💻 Разберем guid — структура .NET для представления глобальных уникальных идентификаторов!

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

➡️ C# Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🤝72
📂 Шпаргалка по LINQ для .NET разработчика!

Например, Where() фильтрует коллекции, Select() преобразует данные, а GroupBy() помогает быстро группировать элементы по ключу.

На картинке — основные LINQ-методы, разбитые по категориям: фильтрация, сортировка, агрегация, группировка, работа с последовательностями и другое.

Сохрани, чтобы не потерять!

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
19🔥14👍4😁4
Взял заказ. Собрал бота. Агентство получило 15 000 рублей.

Пока ты ждёшь лучшую вакансию в своём городе — Владислав Пурвиньш закрывает заказы на чат-ботов силами учеников. (Заказов сейчас висит в поиске 10 786 запросов). Каждый получает от 15 000 рублей за заказ.

Которые даже не шарят в коде. Просто научились одному инструменту. И бизнесы платят им 200-250 000 рублей в месяц.

Схема простая: берёшь реальный заказ из базы → собираешь бота по шаблону → наставник проверяет → сдаёшь и забираешь деньги.

Старт 70-80 000 рублей. С опытом от 200 000 рублей в месяц.

Запусти бота, там пошаговый план как в 2026 году зарабатывать как нефтяник, только с ноута.

👉 @other_digital_bot

Обучение проходит официально — Владислав Пурвиньш имеет образовательную лицензию.
👎9
Локальная валидация и фильтрация в Minimal API с AddEndpointFilter!

В Minimal API удобно обрабатывать запросы в одной строчке. Но что, если нужно добавить проверку или логирование без лишней обвязки?

С .NET 8 можно использовать AddEndpointFilter — он добавляет поведение *только* к нужному эндпоинту.

Создаём минималку с фильтром на размер файла:
app.MapPost("/upload", UploadFile)
.AddEndpointFilter(async (context, next) =>
{
var file = context.GetArgument<IFormFile>(0);
if (file.Length > 5_000_000)
return Results.BadRequest("Файл слишком большой!");

return await next(context); // пропускаем дальше
});


Теперь сам обработчик остаётся максимально чистым:
static IResult UploadFile(IFormFile file)
{
// сохраняем, обрабатываем и т.д.
return Results.Ok("Файл принят!");
}


🔥 Гибкая локальная логика: логирование, авторизация, валидация — без middleware и лишнего кода!

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍4🔥3
📂 Как выбрать cloud database и не утонуть в вариантах?

В облаках есть разные классы баз: relational, key-value, document, wide-column, graph, time-series, search и analytical databases. У каждой модели свои сильные стороны: транзакции, скорость чтения, горизонтальное масштабирование, гибкая схема или аналитические запросы.

На картинке - сравнение облачных database-сервисов и близких open-source альтернатив.

Сохрани, чтобы не потерять!

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64🔥3