Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤5👍3
В этой статье:
• Как устроить слои и батчи, чтобы сократить число draw call.
• Как использовать инстансинг для повторяющихся элементов персонажа.
• Как измерять прирост производительности после изменений.🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4🔥3
int.TryParse в C#: перестаём падать на пользовательском вводе!
Пользователь вводит число в поле, и всё работает до первого «abc» или пустой строки. После этого приложение ловит исключение и ты тратишь время на разбор банального кейса.
Часто пишут так:
Теперь программа не падает, а спокойно обрабатывает ошибку и продолжает работу.
🔥 В итоге ты убираешь лишние исключения и получаешь предсказуемое поведение на реальных данных.
➡️ C# Ready | #практика
Пользователь вводит число в поле, и всё работает до первого «abc» или пустой строки. После этого приложение ловит исключение и ты тратишь время на разбор банального кейса.
Часто пишут так:
Console.Write("Введите возраст: ");
string input = Console.ReadLine()!;
int age = int.Parse(input);
Console.WriteLine($"Возраст: {age}");int.Parse хорош, когда формат уже гарантирован. Для пользовательского ввода безопаснее использовать int.TryParse.Console.Write("Введите возраст: ");
string? input = Console.ReadLine();
if (int.TryParse(input, out int age))
{
Console.WriteLine($"Возраст: {age}");
}
else
{
Console.WriteLine("Некорректный ввод. Введите целое число.");
}Теперь программа не падает, а спокойно обрабатывает ошибку и продолжает работу.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14🔥8👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Внутри — обучение через материалы Microsoft Learn + проверки знаний на стороне freeCodeCamp: ты пройдёшь основы языка (переменные, типы данных, управляющие конструкции) и базовые принципы ООП
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤6🔥6
🔥18❤6👍3
В этой статье:
• Какие пакеты реально экономят время в типовых задачах.
• Где пакет уместен в проде, а где лучше остаться на стандартном API.
• Как оценивать риски новой зависимости перед подключением.🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤6🔥5👎2
Почему async void приводит к потерянным ошибкам?
Иногда хочется быстро сделать асинхронный метод и поставить
Поэтому баги всплывают позже и разбор занимает больше времени.
Вот как обычно выглядит такая ситуация:
Проблема в том, что при
Надёжнее вернуть
Теперь поведение предсказуемо. Ты сразу видишь точку ошибки и можешь обработать её в нужном месте.
🔥 В обычном коде используйте
➡️ C# Ready | #практика
Иногда хочется быстро сделать асинхронный метод и поставить
async void. Сначала всё выглядит нормально, но при ошибке вызывающий код уже не может корректно обработать исключение.Поэтому баги всплывают позже и разбор занимает больше времени.
Вот как обычно выглядит такая ситуация:
static async void ProcessOrderAsync(int id)
{
await Task.Delay(100);
throw new InvalidOperationException($"Order {id} failed");
}
ProcessOrderAsync(42);
Console.WriteLine("Дальше код идёт как будто всё хорошо");
Проблема в том, что при
async void вызывающий код не может дождаться завершения метода. По этой причине ошибка теряет контекст и в логах часто выглядит случайной.Надёжнее вернуть
Task и явно дождаться выполнения:static async Task ProcessOrderAsync(int id)
{
await Task.Delay(100);
throw new InvalidOperationException($"Order {id} failed");
}
try
{
await ProcessOrderAsync(42);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Теперь поведение предсказуемо. Ты сразу видишь точку ошибки и можешь обработать её в нужном месте.
async Task. async void оставляйте только для обработчиков событий.Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍8🔥6
Как убрать «лес» вложенных `if` из метода?
Часто вся валидация и проверки прав зашиваются внутрь одной большой конструкции, и тело метода уезжает вправо на пол-экрана:
С guard-условиями (ранними выходами) проверки поднимаем в начало, а дальше оставляем только «нормальный путь»:
Метод читается сверху вниз как список требований, а основная логика не утопает во вложениях. Такой подход хорошо заходит для валидаций, проверок прав, preconditions в сервисах и хендлерах.
🔥 Меньше вложенности, легче читать диффы и гораздо проще добавлять новые условия.
➡️ C# Ready | #совет
Часто вся валидация и проверки прав зашиваются внутрь одной большой конструкции, и тело метода уезжает вправо на пол-экрана:
void ProcessOrder(Order order)
{
if (order != null)
{
if (order.IsPaid)
{
if (!order.IsCancelled)
{
Ship(order);
}
}
}
}
С guard-условиями (ранними выходами) проверки поднимаем в начало, а дальше оставляем только «нормальный путь»:
void ProcessOrder(Order order)
{
if (order is null) return;
if (!order.IsPaid) return;
if (order.IsCancelled) return;
Ship(order);
}
Метод читается сверху вниз как список требований, а основная логика не утопает во вложениях. Такой подход хорошо заходит для валидаций, проверок прав, preconditions в сервисах и хендлерах.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤33🔥8🤝4
This media is not supported in your browser
VIEW IN TELEGRAM
Технический блог от опытного
.NET разработчика и Microsoft MVP, где автор делится глубокими практическими заметками, гайдами и идеями по современному разработку с ASP.NET Core, C#, .NET Core/NET 10 и связанным инструментам.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤4👍4
QuestPDF создаёт аккуратный счёт из ваших данных, избавляя команду от редакторов и копипаста ручного труда.
Что важно знать
• Меняет стиль легко
• Работает на любом компьютере
• Создаёт файл мгновенно
Подключите пакет, скопируйте шаблон и уже сегодня отправляйте клиентам профессиональные, читаемые счета в PDF формате.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14🤝11👍4🔥2
await using — асинхронно освобождаем ресурсы без лишних try/finally!
Часто мы открываем файлы или сетевые стримы асинхронно, но… освобождаем синхронно, блокируя поток. В .NET есть решение: интерфейс
Старая реализация закрывает поток синхронно, заставляя поток ожидать завершения операции, и нагружает планировщик лишними блокировками:
Новая версия использует await using, освобождая ресурсы асинхронно без блокировок и шаблонного кода при завершении:
🔥
➡️ C# Ready | #практика
Часто мы открываем файлы или сетевые стримы асинхронно, но… освобождаем синхронно, блокируя поток. В .NET есть решение: интерфейс
IAsyncDisposable и ключевое слово await using — всё по-современному и без ручного DisposeAsync().Старая реализация закрывает поток синхронно, заставляя поток ожидать завершения операции, и нагружает планировщик лишними блокировками:
// Было — синхронный Dispose
async Task<long> Old(string p)
{
var s = new FileStream(p, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true);
try { return s.Length; }
finally { s.Dispose(); } // блокирует поток
}
Новая версия использует await using, освобождая ресурсы асинхронно без блокировок и шаблонного кода при завершении:
// Стало — await using + DisposeAsync
async Task<long> New(string p)
{
await using var s = new FileStream(p, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true);
return s.Length; // всё асинхронно и лаконично
}
await using автоматически вызывает DisposeAsync() без блокировок и лишнего кода — особенно важно в высоконагруженных сервисах и UI-приложениях.Please open Telegram to view this post
VIEW IN TELEGRAM
❤15🔥9👍5
❤9🔥4👍3