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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/csharp_ready
Download Telegram
👩‍💻 Сортируем LINQ без сюрпризов!

В этой шпаргалке — понятная разница между обычной и вторичной сортировкой, когда уместен Reverse(), и как задавать свой порядок сравнения без лишней путаницы.

➡️ C# Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍11🤝8
☕️ Нашел вам разбор ConfigureAwait без мифов — когда он нужен, а когда нет!

В этой статье:
• Что делает SynchronizationContext и почему это важно для await
• Когда ConfigureAwait(false) даёт пользу, а когда ломает логику
• Особые случаи: IAsyncEnumerable, библиотеки и “контекстные” приложения

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


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍6🔥3😁2
Retry с Polly — переживаем временные ошибки без ручных try/catch!

Иногда внешний API или сервис отвечает ошибкой (500, timeout), но при повторной попытке всё работает. Оборачивать каждый запрос в try/catch и писать циклы — неудобно. Проще использовать Polly и задать политику повторных попыток.

Сначала подключим нужные пакеты и пространства имён:
using System;
using System.Net.Http;
using Polly;
using Polly.Retry;


Создадим политику retry: при ошибке запроса пробуем ещё 3 раза с паузой в 1 секунду:
RetryPolicy retryPolicy = Policy
.Handle<HttpRequestException>()
.WaitAndRetry(
retryCount: 3,
sleepDurationProvider: _ => TimeSpan.FromSeconds(1),
onRetry: (exception, timeSpan, retryCount, context) =>
{
Console.WriteLine($"Повтор #{retryCount} через {timeSpan.TotalSeconds} сек...");
});


Теперь используем эту политику при выполнении HTTP-запроса:
string GetDataWithRetry()
{
return retryPolicy.Execute(() =>
{
Console.WriteLine("Делаем запрос...");
return CallUnstableService();
});
}


Для примера сделаем простую «заглушку» нестабильного сервиса:
int attempt = 0;

string CallUnstableService()
{
attempt++;

if (attempt < 3)
throw new HttpRequestException("Сервис временно недоступен");

return "Данные успешно получены";
}


Теперь посмотрим, как это работает:
Console.WriteLine(GetDataWithRetry());


Возможный вывод в консоли:
Делаем запрос...
Повтор #1 через 1 сек...
Делаем запрос...
Повтор #2 через 1 сек...
Делаем запрос...
Данные успешно получены


🔥 Обрати внимание: код запроса остался чистым — Polly сам управляет повторами и задержками, без лишних try/catch.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥7👍6
Как не ловить NullReferenceException в цепочках user.Profile.Address.City?

Когда данные приходят из API/БД/ввода пользователя — в любой момент может прилететь null. И вместо простого чтения свойства появляется лес из проверок:
string city;

if (user != null &&
user.Profile != null &&
user.Profile.Address != null &&
user.Profile.Address.City != null)
{
city = user.Profile.Address.City;
}
else
{
city = "Не указан";
}


С null-conditional оператором ?. и значением по умолчанию через ?? то же самое пишется коротко и читаемо:
var city = user?.Profile?.Address?.City ?? "Не указан";


?. работает как “безопасная точка”: если слева null — выражение дальше не падает и возвращает null.
А ?? подставляет значение, если результат оказался null.

🔥 Итог: меньше шума, меньше ручных проверок, меньше шансов словить NullReferenceException. Код читается как правило: «если чего-то нет — подставь дефолт».

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍95
Разница между out и ref — когда что использовать?

В C# оба ключевых слова позволяют передавать параметры по ссылке, но работают они по-разному. Из-за этого их часто путают — особенно на собеседованиях.

Разберёмся на простом и наглядном примере.

Создадим метод с параметром ref. В этом случае переменная обязана быть инициализирована до вызова метода:
void Increment(ref int number)
{
number++;
}


Используем его:
int value = 5;
Increment(ref value);
Console.WriteLine(value);


Вывод в консоли:
6


Теперь сделаем похожий метод, но уже с out. Здесь метод обязан присвоить значение параметру внутри себя:
void CreateValue(out int number)
{
number = 10;
}


Вызовем его — обратите внимание, что переменную заранее инициализировать не нужно:
int result;
CreateValue(out result);
Console.WriteLine(result);


Результат:
10


🔥 Главное различие:
ref — работает с уже существующим значением
out — используется, когда метод создаёт значение и возвращает его через параметр

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍188🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
❤️ ShaderToy — шейдеры в браузере и море вдохновения!

Это платформа, где можно писать и запускать GLSL-шейдеры прямо в браузере: огромная библиотека работ сообщества, живые демки, код рядом с результатом, плюс удобный редактор для экспериментов со светом, шумами, пост-эффектами и процедурной графикой.

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥7👍4
👩‍💻 IDisposable без лишней магии!

В этой шпаргалке — наглядное объяснение того, как в .NET правильно освобождать ресурсы: чем отличается Dispose от финализации, как работает using, когда нужен await using и почему IAsyncDisposable важен для современного асинхронного кода.

➡️ C# Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1211👍3🤝1
📂 Напоминалка по REST API

На картинке — компактная шпаргалка про то, каким должен быть “правильный” REST: запросы без состояния, предсказуемые URL, безопасность через HTTPS, версионирование, аккуратная работа с коллекциями (фильтры и пагинация) и понятная логика взаимодействия клиента с сервером.

Сохрани, чтобы быстро сверяться при проектировании и ревью API

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍5🔥4
Как не писать if (x == null) throw ... вручную?

В C# мы постоянно защищаемся от null: в публичных методах, сервисах, хендлерах, контроллерах. И почти в каждом месте повторяется один и тот же шаблон:
if (options == null)
throw new ArgumentNullException(nameof(options));


Это работает, но:

• код раздувается от однотипных проверок,
• легко забыть nameof(...) или написать не то имя,
• “полезная” логика тонет в бойлерплейте.

В современных версиях .NET есть короткий и безопасный вариант:
ArgumentNullException.ThrowIfNull(options);


Он делает ровно то же самое — бросает ArgumentNullException, если аргумент null, — но запись становится в разы чище.

🔥 Итог: вместо ручного if (...) throw ... используй ArgumentNullException.ThrowIfNull(x) — меньше шума, меньше копипасты, проще читать метод с первого взгляда.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍14🤝6🔥31
👍 Отличная статья — про инкрементные Source Generators: как ускорить генерацию и не грузить IDE лишним!

В этой статье:

• Разобраться, чем incremental отличается от классических генераторов
• Увидеть, как собирается пайплайн: провайдеры, трансформации
• Понять практические кейсы: генерация boilerplate, DSL-подходы

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


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65🔥4😁1
Обрабатываем ошибки с try-catch-finally!

Сейчас научимся ловить ошибки во время выполнения программы с помощью конструкции try-catch. Это особенно полезно, когда пользователь может ввести некорректные данные — например, буквы вместо чисел.

Подключим нужные библиотеки — всё уже есть в стандартной библиотеке:
using System;


Допустим, мы хотим преобразовать строку в число. Если строка — не число, программа «упадёт»:
string input = "abc";
int number = Convert.ToInt32(input); // тут возникнет ошибка


Чтобы программа не завершалась с ошибкой, обернём этот код в try-catch. Если произойдёт исключение, оно будет поймано и обработано:
try {
string input = "abc";
int number = Convert.ToInt32(input);
Console.WriteLine($"Число: {number}");
}


Если строка не может быть преобразована в число, будет выброшено исключение типа FormatException.
catch (FormatException) {
Console.WriteLine("Ошибка: введена нечисловая строка.");
}


И наконец, добавим блок finally. Он выполняется всегда — даже если произошла ошибка.
finally {
Console.WriteLine("Завершено выполнение блока.");
}


🔥 Без try-catch программа завершилась бы аварийно. А с обработкой исключений — работает стабильно, даже при ошибочном вводе.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍137🔥4😁1
14👍10🔥6😁2