Собрали для вас в карточках пункты, которые необходимо знать, чтобы вас не смогли выпнуть с работы. Знайте свои права и читайте полную статью.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰7👍2
В .NET есть простой способ скрыть внутреннюю кухню и оставить только то, что важно потребителю API. Атрибут
StackTraceHiddenAttribute помечает методы, которые не должны попадать в публичный стектрейс, при этом логика выполнения не меняется.Пример:
public static class UserService
{
[StackTraceHidden]
private static void ValidateName(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("Name cannot be empty");
}
public static void CreateUser(string name)
{
ValidateName(name);
Console.WriteLine("Created user " + name);
}
}
В этом примере при исключении из
ValidateName в стектрейсе вы увидите только вызов UserService.CreateUser. Валидационный хелпер скрыт атрибутом, поэтому внешний разработчик не видит внутренний слой проверки.#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🥰2❤1
🔄 WSL 2.7.0: обновление с новым ядром
Windows Subsystem for Linux это встроенный слой совместимости, который позволяет запускать Linux и его приложения напрямую без виртуальной машины.
В WSL 2.7.0 ядро обновили до ветки Linux 6.6.114. Параллельно подтянули новые версии WSLg .NET и связанных NuGet пакетов.
Список поддерживаемых дистрибутивов пополнился свежими релизами: Debian 13, Ubuntu 25.10, Fedora 43, а также Kali 2025.3 и декабрьская сборка Arch Linux.
➡️ Релиз на GitHub
🐸 Библиотека шарписта
#async_news
Windows Subsystem for Linux это встроенный слой совместимости, который позволяет запускать Linux и его приложения напрямую без виртуальной машины.
В WSL 2.7.0 ядро обновили до ветки Linux 6.6.114. Параллельно подтянули новые версии WSLg .NET и связанных NuGet пакетов.
Список поддерживаемых дистрибутивов пополнился свежими релизами: Debian 13, Ubuntu 25.10, Fedora 43, а также Kali 2025.3 и декабрьская сборка Arch Linux.
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤12🔥4
Собрали в один пост всё, что произошло за неделю.
— Первое сервисное обновление .NET 10
— Кроссплатформенная SharpIDE
— Fleet В С Ё
Почитать:
— Карьерная «страховка» для IT‑шника
— Как вуз влияет на карьеру
— Закон Брукса в разработке
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
📊 Рейтинг постов
Вы всю неделю ставили нам лайки, а мы выбрали топ по реакциям:
• 100 RPS Rate Limiting
• Закон Брукса в разработке
• Антиспам в .NET
• FluentValidation в API
• StackTraceHiddenAttribute
Давайте выберем самый лучший пост в голосовании.
Что добавить в следующий спринт? Пишите! 👇
🐸 Библиотека шарписта
#entry_point
Вы всю неделю ставили нам лайки, а мы выбрали топ по реакциям:
• 100 RPS Rate Limiting
• Закон Брукса в разработке
• Антиспам в .NET
• FluentValidation в API
• StackTraceHiddenAttribute
Давайте выберем самый лучший пост в голосовании.
Что добавить в следующий спринт? Пишите! 👇
#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰5🔥1
Anonymous Poll
26%
100 RPS Rate Limiting
11%
Закон Брукса в разработке
25%
Антиспам в .NET
25%
FluentValidation в API
12%
StackTraceHiddenAttribute
🥱8🥰2
Когда в проекте десятки эндпоинтов, разъезжающий по коду try catch быстро превращается в свалку. Гораздо проще один раз настроить глобальный маппинг исключений в HTTP статус и возвращать нормальные ProblemDetails для всех ошибок.
ASP.NET уже умеет работать с ProblemDetails из коробки, нужно только включить службу и повесить обработчик ошибок.
В примере вся логика перевода исключений в HTTP ответы живет в одном месте:
builder.Services.AddProblemDetails();
var app = builder.Build();
app.UseExceptionHandler(appErr =>
{
appErr.Run(async ctx =>
{
var ex = ctx.Features.Get<IExceptionHandlerFeature>()?.Error;
var (status, noscript) = ex switch
{
ConcurrencyException => (StatusCodes.Status409Conflict, "Concurrency conflict"),
NotFoundException => (StatusCodes.Status404NotFound, "Resource not found"),
_ => (StatusCodes.Status500InternalServerError, "Server error")
};
ctx.Response.StatusCode = status;
await ctx.Response.WriteAsJsonAsync(new ProblemDetails
{
Status = status,
Title = noscript,
Detail = app.Environment.IsDevelopment() ? ex?.Message : null,
Instance = ctx.Request.Path
});
});
});
Любые новые исключения добавляются через одну запись в switch, без походов по контроллерам, а все ответы об ошибках приходят в едином формате application/problem+json, что упрощает жизнь фронту и интеграциям.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤22👍14
📍 Навигация: Вакансии • Задачи • Собесы
#garbage_collector
Please open Telegram to view this post
VIEW IN TELEGRAM
😁39🥰1🌚1👾1
Сборщик мусора для старых знаний
В экосистеме .NET всё меняется, но фундамент вечен. Если чувствуешь, что уперся в потолок сеньорити, пора инвестировать в хард-скиллы, а не просто учить новый синтаксис C
12.
Оффер 1 + 2:
Покупаешь один курс (по старшей цене) — получаешь доступ к трем.
Выбор .NET-комьюнити:
— архитектуры и шаблоны проектирования (SOLID, GRASP и вот это всё);
— алгоритмы и структуры данных.
Скомпилировать успех
Акция до 31 декабря.
NullReferenceException при выборе? Пиши сюда: @manager_proglib
В экосистеме .NET всё меняется, но фундамент вечен. Если чувствуешь, что уперся в потолок сеньорити, пора инвестировать в хард-скиллы, а не просто учить новый синтаксис C
12.
Оффер 1 + 2:
Покупаешь один курс (по старшей цене) — получаешь доступ к трем.
Выбор .NET-комьюнити:
— архитектуры и шаблоны проектирования (SOLID, GRASP и вот это всё);
— алгоритмы и структуры данных.
Скомпилировать успех
Акция до 31 декабря.
NullReferenceException при выборе? Пиши сюда: @manager_proglib
❤2🥰1
🚦 SemaphoreSlim в проде — не просто «асинхронный lock»
SemaphoreSlim часто кидают в код как самое простое решение и успокаиваются. В проде этого мало, ведь малейшая ошибка с Release, областью блокировки или per-key словарем легко превращается в дедлок, гонку или утечку памяти.
Самый частый фейл — банальное «забыли Release». Исключение между
Вторая классика — блокировки внутри async кода. Варианты вроде
Общий принцип не блокировать внутри асинхронной критической секции если нужно синхронное API выносить его в
Поэтому в проде почти всегда лучше прятать SemaphoreSlim за абстракцией AsyncLock. Обертка с
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор
SemaphoreSlim часто кидают в код как самое простое решение и успокаиваются. В проде этого мало, ведь малейшая ошибка с Release, областью блокировки или per-key словарем легко превращается в дедлок, гонку или утечку памяти.
Самый частый фейл — банальное «забыли Release». Исключение между
WaitAsync и finally и семафор навсегда занят поэтому все будущие вызовы повисают. Помогает только жесткое правило всегда оборачивать WaitAsync в try finally и не вставлять лишний код между ними особенно никакой логики которая может бросить исключение.Вторая классика — блокировки внутри async кода. Варианты вроде
_lock.Wait() или .Result внутри секции под SemaphoreSlim открывают прямую дорогу к дедлокам, потому что блокирующий вызов держит поток, а продолжение ждет этот же поток. Общий принцип не блокировать внутри асинхронной критической секции если нужно синхронное API выносить его в
Task.Run до входа в lock.Поэтому в проде почти всегда лучше прятать SemaphoreSlim за абстракцией AsyncLock. Обертка с
LockAsync() возвращающей IDisposable снимает часть рисков.📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🥰1
⏳ GetElapsedTime вместо ручного Stopwatch шаблона
Многие до сих пор измеряют время в .NET по старинке создают экземпляр Stopwatch, вызывают Start, ждут выполнение и читают Elapsed.
Но есть более простой и аккуратный способ через
Классический шаблон выглядит так:
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view
Многие до сих пор измеряют время в .NET по старинке создают экземпляр Stopwatch, вызывают Start, ждут выполнение и читают Elapsed.
Но есть более простой и аккуратный способ через
Stopwatch.GetTimestamp и Stopwatch.GetElapsedTime.Классический шаблон выглядит так:
long start = Stopwatch.GetTimestamp();
// код, который нужно измерить
await ProcessOrderAsync();
TimeSpan elapsed = Stopwatch.GetElapsedTime(start);
GetElapsedTime вычисляет разницу между текущим timestamp и сохранённым значением и возвращает TimeSpan без создания экземпляра Stopwatch. В результате нет лишней аллокации.📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32❤4🥰4
В официальном .NET блоге появилась большая статья о том как собирать iOS виджеты поверх .NET MAUI не теряя нативности.
Автор делится практическим опытом, который раньше приходилось выкапывать по кускам в доках Apple и чужих репозиториях.
Статья не пошаговый туториал, а набор ключевых шагов и граблей от настроек App Groups и bundle id до интеграции Xcode виджет расширения в MAUI проект.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🎁 Письмо Деду Морозу
До Нового Года 15 дней! Что бы вы хотели получить в подарок? Годовая премия не в счёт, это всегда как рулетка — повезёт/не повезёт.
Админ хотел бы набор оперативной памяти, желательно гига 32, откладывал до последнего и вот итог..
💬 Делитесь своими хотелками или сразу вишлистами в комментах 👇
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#entry_point
До Нового Года 15 дней! Что бы вы хотели получить в подарок? Годовая премия не в счёт, это всегда как рулетка — повезёт/не повезёт.
Админ хотел бы набор оперативной памяти, желательно гига 32, откладывал до последнего и вот итог..
📍 Навигация: Вакансии • Задачи • Собесы
#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM