Собираем валидатор пароля на C#!
Нужно проверить пароль и показать пользователю понятные причины отказа? Сделаем небольшой валидатор, где каждое правило отвечает за одну проверку и возвращает конкретную ошибку.
В этой задаче:
Такой подход удобнее одного большого if: правила проще расширять, тестировать и переиспользовать в разных частях приложения.
➡️ C# Ready | #совет
Нужно проверить пароль и показать пользователю понятные причины отказа? Сделаем небольшой валидатор, где каждое правило отвечает за одну проверку и возвращает конкретную ошибку.
В этой задаче:
• Описываем правила как функции;
• Проверяем длину, цифры, регистр и спецсимволы;
• Собираем все ошибки в один список.
Такой подход удобнее одного большого if: правила проще расширять, тестировать и переиспользовать в разных частях приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤8🔥3
Полезная статья про Avalonia и реализацию MVVM на C# по шагам!
В этой статье:
• Что такое Avalonia и почему она интересна для кроссплатформенного desktop
• Как разделить интерфейс и бизнес-логику через MVVM
• Как постепенно собрать пример приложения с View, ViewModel, binding и данными
➡️ C# Ready | #статья
В этой статье:
• Что такое Avalonia и почему она интересна для кроссплатформенного desktop
• Как разделить интерфейс и бизнес-логику через MVVM
• Как постепенно собрать пример приложения с View, ViewModel, binding и данными
Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤4🔥4👎1
Делаем простой rate limiter на C#!
Иногда нужно ограничить частоту действий: не давать пользователю слишком часто нажимать кнопку, вызывать команду или отправлять запрос
В этой задаче:
Такой подход легко расширить: можно поменять лимит, размер окна или хранить отдельную очередь для каждого пользователя.
➡️ C# Ready | #задача
Иногда нужно ограничить частоту действий: не давать пользователю слишком часто нажимать кнопку, вызывать команду или отправлять запрос
В этой задаче:
• храним timestamps последних вызовов;
• удаляем старые события;
• проверяем лимит в скользящем окне;
Такой подход легко расширить: можно поменять лимит, размер окна или хранить отдельную очередь для каждого пользователя.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍6🔥4
Разберём HttpClient: 7 возможностей для аккуратной работы с API!
HttpClient часто используют для интеграций, микросервисов и внешних HTTP-запросов. Чтобы код не превращался в ручную сборку строк, заголовков и JSON, стоит знать базовые возможности клиента.
В этой шпоре:
Эти вещи помогают писать API-клиенты короче, понятнее и устойчивее к зависаниям и ошибочным статусам.
➡️ C# Ready | #шпора
HttpClient часто используют для интеграций, микросервисов и внешних HTTP-запросов. Чтобы код не превращался в ручную сборку строк, заголовков и JSON, стоит знать базовые возможности клиента.
В этой шпоре:
• базовый адрес через BaseAddress;
• общие заголовки;
• GET-запросы;
Эти вещи помогают писать API-клиенты короче, понятнее и устойчивее к зависаниям и ошибочным статусам.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤5👍4
Крутая статья о том, как подружить C#, .NET MAUI и Rust в одном приложении!
В этой статье:
• Как подключить Rust-код к MAUI-проекту
• Зачем может понадобиться нативная часть внутри C#-приложения
• Как C# и Rust могут вместе работать с графикой через SkiaSharp
➡️ C# Ready | #статья
В этой статье:
• Как подключить Rust-код к MAUI-проекту
• Зачем может понадобиться нативная часть внутри C#-приложения
• Как C# и Rust могут вместе работать с графикой через SkiaSharp
Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5🔥5
Почему не стоит lock-ать строку или публичный объект?
В C#
Проблема начинается, когда в роли
Строки могут интернироваться, то есть одинаковые литералы могут ссылаться на один и тот же объект.
В итоге другой код в приложении тоже может случайно заблокироваться на
Похожая проблема с публичными объектами:
Любой внешний код может взять этот объект и тоже сделать
Надёжнее держать приватный синхронизатор:
Так точка блокировки остаётся внутри класса, и никто снаружи не может случайно вмешаться.
➡️ C# Ready | #совет
В C#
lock работает по объекту-синхронизатору:lock (sync)
{
// критическая секция
}
Проблема начинается, когда в роли
sync используют строку:lock ("cache")
{
UpdateCache();
}Строки могут интернироваться, то есть одинаковые литералы могут ссылаться на один и тот же объект.
В итоге другой код в приложении тоже может случайно заблокироваться на
"cache":lock ("cache")
{
DoSomethingElse();
}Похожая проблема с публичными объектами:
public object Sync = new();
Любой внешний код может взять этот объект и тоже сделать
lock, создавая странные зависания.Надёжнее держать приватный синхронизатор:
private readonly object _sync = new();
lock (_sync)
{
UpdateCache();
}
Так точка блокировки остаётся внутри класса, и никто снаружи не может случайно вмешаться.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🔥3
Проверяем срок действия TLS-сертификата!
Нужно быстро понять, когда у сайта закончится HTTPS-сертификат? Соберём простую проверку через openssl: подключимся к серверу, достанем notAfter и посчитаем, сколько дней осталось до истечения.
В этой задаче:
Такую проверку удобно запускать в cron, CI или простом мониторинговом скрипте, чтобы не узнать об истёкшем сертификате от пользователей.
➡️ C# Ready | #задача
Нужно быстро понять, когда у сайта закончится HTTPS-сертификат? Соберём простую проверку через openssl: подключимся к серверу, достанем notAfter и посчитаем, сколько дней осталось до истечения.
В этой задаче:
• Получаем сертификат через openssl s_client;
• Достаём дату окончания через openssl x509;
• Считаем разницу и проверяем порог.
Такую проверку удобно запускать в cron, CI или простом мониторинговом скрипте, чтобы не узнать об истёкшем сертификате от пользователей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍5🔥3