Переведём сухие числа разницы во времени в живые фразы, чтобы «через час» и «три дня назад» звучали естественно и не требовали пересчёта.
В этой задаче узнаешь:
• Как почувствовать разницу между датами, а не числами;
• Где естественно сказать «назад», а где «через»;
• Почему короткая фраза о времени понятнее таймера.
Когда интерфейс говорит с человеком человеческим языком, время перестаёт быть абстракцией. Пусть твои даты звучат как живые истории, а не скучные отметки в протоколе.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍8❤5🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
Сайт с огромной коллекцией задач по программированию, от самых простых до тех, что реально заставят подумать.
Учиться можно на абсолютно любом языке. Отличный способ подтянуть логику, научиться писать аккуратный код и подготовиться к собесам.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤7👍4
Как убрать 10 одинаковых using в каждом файле?
В проектах быстро появляется “шапка”, которая копируется из файла в файл:
В C# 10 можно вынести общие
🔥 Итог: файлы становятся чище, меньше копипасты, меньше “шума” в каждом классе. Главное правило — выноси в global только то, что реально используется повсеместно (иначе можно получить лишние конфликты имён и путаницу).
➡️ C# Ready | #совет
В проектах быстро появляется “шапка”, которая копируется из файла в файл:
System, Linq, коллекции, логирование, общие неймспейсы фреймворка. Полезного кода ещё нет, а сверху уже простыня.using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
// + ещё 5–10 строк...
В C# 10 можно вынести общие
using в один файл и сделать их глобальными — тогда они автоматически применяются ко всему проекту:// GlobalUsings.cs
global using System;
global using System.Linq;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥11❤7😁2🤝1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍11🤝8
В этой статье:
• Что делает SynchronizationContext и почему это важно для await• Когда ConfigureAwait(false) даёт пользу, а когда ломает логику• Особые случаи: IAsyncEnumerable, библиотеки и “контекстные” приложения🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍6🔥3😁2
Retry с Polly — переживаем временные ошибки без ручных try/catch!
Иногда внешний API или сервис отвечает ошибкой (500, timeout), но при повторной попытке всё работает. Оборачивать каждый запрос в
Сначала подключим нужные пакеты и пространства имён:
Создадим политику retry: при ошибке запроса пробуем ещё 3 раза с паузой в 1 секунду:
Теперь используем эту политику при выполнении HTTP-запроса:
Для примера сделаем простую «заглушку» нестабильного сервиса:
Теперь посмотрим, как это работает:
Возможный вывод в консоли:
🔥 Обрати внимание: код запроса остался чистым — Polly сам управляет повторами и задержками, без лишних
➡️ C# Ready | #практика
Иногда внешний 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 сек...
Делаем запрос...
Данные успешно получены
try/catch.Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥7👍6
Как не ловить NullReferenceException в цепочках user.Profile.Address.City?
Когда данные приходят из API/БД/ввода пользователя — в любой момент может прилететь
С null-conditional оператором
А
🔥 Итог: меньше шума, меньше ручных проверок, меньше шансов словить
➡️ C# Ready | #совет
Когда данные приходят из 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. Код читается как правило: «если чего-то нет — подставь дефолт».Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍9❤5
Разница между out и ref — когда что использовать?
В C# оба ключевых слова позволяют передавать параметры по ссылке, но работают они по-разному. Из-за этого их часто путают — особенно на собеседованиях.
Разберёмся на простом и наглядном примере.
Создадим метод с параметром
Используем его:
Вывод в консоли:
Теперь сделаем похожий метод, но уже с
Вызовем его — обратите внимание, что переменную заранее инициализировать не нужно:
Результат:
🔥 Главное различие:
➡️ C# Ready | #практика
В 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 — используется, когда метод создаёт значение и возвращает его через параметрPlease open Telegram to view this post
VIEW IN TELEGRAM
👍18❤8🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Это платформа, где можно писать и запускать GLSL-шейдеры прямо в браузере: огромная библиотека работ сообщества, живые демки, код рядом с результатом, плюс удобный редактор для экспериментов со светом, шумами, пост-эффектами и процедурной графикой.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥7👍4
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤11👍3🤝1
На картинке — компактная шпаргалка про то, каким должен быть “правильный” REST: запросы без состояния, предсказуемые URL, безопасность через HTTPS, версионирование, аккуратная работа с коллекциями (фильтры и пагинация) и понятная логика взаимодействия клиента с сервером.
Сохрани, чтобы быстро сверяться при проектировании и ревью API
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍5🔥4
Как не писать if (x == null) throw ... вручную?
В C# мы постоянно защищаемся от
Это работает, но:
• код раздувается от однотипных проверок,
• легко забыть
• “полезная” логика тонет в бойлерплейте.
В современных версиях .NET есть короткий и безопасный вариант:
Он делает ровно то же самое — бросает
🔥 Итог: вместо ручного
➡️ C# Ready | #совет
В C# мы постоянно защищаемся от
null: в публичных методах, сервисах, хендлерах, контроллерах. И почти в каждом месте повторяется один и тот же шаблон:if (options == null)
throw new ArgumentNullException(nameof(options));
Это работает, но:
• код раздувается от однотипных проверок,
• легко забыть
nameof(...) или написать не то имя,• “полезная” логика тонет в бойлерплейте.
В современных версиях .NET есть короткий и безопасный вариант:
ArgumentNullException.ThrowIfNull(options);
Он делает ровно то же самое — бросает
ArgumentNullException, если аргумент null, — но запись становится в разы чище.if (...) throw ... используй ArgumentNullException.ThrowIfNull(x) — меньше шума, меньше копипасты, проще читать метод с первого взгляда.Please open Telegram to view this post
VIEW IN TELEGRAM
1👍14🤝6🔥3❤1
В этой статье:
• Разобраться, чем incremental отличается от классических генераторов• Увидеть, как собирается пайплайн: провайдеры, трансформации• Понять практические кейсы: генерация boilerplate, DSL-подходы🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤5🔥4😁1