Microsoft выпустила сервисные обновления для .NET 8.0 и .NET 9.0 с исправлениями уязвимостей и багов.
Исправили три уязвимости: CVE-2025-55315, CVE-2025-55247 и CVE-2025-21176.
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁25👍12💯1
🛠 Почему dynamic не заслуживает пожизненного бана
Представьте: кто-то в команде написал код с dynamic, получил RuntimeBinderException в продакшене, и теперь это слово под запретом навсегда.
Это самая ленивая политика в истории .NET. Вместо того чтобы разобраться с проблемой, команды просто заклеивают её скотчем из запретов.
В чём подвох
Когда вы запрещаете dynamic, разработчики не перестают решать те же задачи. Они просто переходят на рефлексию. И получается вот:
800 строк рефлексии с silent nulls и магическими строками. Риски те же, код хуже, багов больше.
Когда dynamic действительно нужен
В 95% случаев dynamic — избыточен. Но есть сценарии, где он просто незаменим:
• Плагин-системы
Ваше приложение загружает расширения, которые вы не компилировали вместе с основным кодом. У вас нет доступа к типам на этапе компиляции. dynamic позволяет вызвать
• Скриптинг
Админы пишут небольшие скрипты для настройки логики — расчёт цен, трансформация данных. Вам не нужны 20 статических классов. Вам нужна гибкость с контролем.
• Duck typing в тестах
Когда вы тестируете поведение, а не типы. Не важно, какой это класс — важно, что он умеет делать
Проблема не в dynamic. Проблема в бесконтрольном доступе. Если вы валидируете имена методов, ограничиваете доступ, логируете вызовы и ставите таймауты — вы в безопасности. Возможно, даже в большей, чем с тем лабиринтом из reflection, который живёт в половине вашего кода плагинов.
🐸 Библиотека шарписта
#sharp_view
Представьте: кто-то в команде написал код с dynamic, получил RuntimeBinderException в продакшене, и теперь это слово под запретом навсегда.
Это самая ленивая политика в истории .NET. Вместо того чтобы разобраться с проблемой, команды просто заклеивают её скотчем из запретов.
В чём подвох
Когда вы запрещаете dynamic, разработчики не перестают решать те же задачи. Они просто переходят на рефлексию. И получается вот:
// Вместо одной строки
dynamic plugin = LoadPlugin("RenderEngine");
plugin.Render(data);
// Пишем вот это
var pluginType = plugin.GetType();
var method = pluginType.GetMethod("Render");
if (method == null) throw new InvalidOperationException("Method not found");
method.Invoke(plugin, new object[] { data });
800 строк рефлексии с silent nulls и магическими строками. Риски те же, код хуже, багов больше.
Когда dynamic действительно нужен
В 95% случаев dynamic — избыточен. Но есть сценарии, где он просто незаменим:
• Плагин-системы
Ваше приложение загружает расширения, которые вы не компилировали вместе с основным кодом. У вас нет доступа к типам на этапе компиляции. dynamic позволяет вызвать
plugin.Calculate()
без танцев с reflection.• Скриптинг
Админы пишут небольшие скрипты для настройки логики — расчёт цен, трансформация данных. Вам не нужны 20 статических классов. Вам нужна гибкость с контролем.
• Duck typing в тестах
Когда вы тестируете поведение, а не типы. Не важно, какой это класс — важно, что он умеет делать
GetPrice()
. Не нужно создавать фейковые интерфейсы ради компилятора.Проблема не в dynamic. Проблема в бесконтрольном доступе. Если вы валидируете имена методов, ограничиваете доступ, логируете вызовы и ставите таймауты — вы в безопасности. Возможно, даже в большей, чем с тем лабиринтом из reflection, который живёт в половине вашего кода плагинов.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🥱1
♾️ 17 формул, которые изменили мир
Математика в действии — как уравнения, придуманные века назад, сегодня управляют интернетом, медициной, космосом и вашими финансами.
📎 Читать статью
А если после статьи захотите разобраться, как эта математика работает в Data Science — вот экспресс-курс, который всё расставит по полочкам:
«Математика для Data Science»
🎓 За 2 месяца поймёте, как работают алгоритмы ML под капотом.
🗓️ Старт — 6 ноября
👉 Записаться на курс
Математика в действии — как уравнения, придуманные века назад, сегодня управляют интернетом, медициной, космосом и вашими финансами.
📎 Читать статью
А если после статьи захотите разобраться, как эта математика работает в Data Science — вот экспресс-курс, который всё расставит по полочкам:
«Математика для Data Science»
— практика и живые уроки
— разбор кода и проверка домашних
— поддержка в Telegram-чате
🎓 За 2 месяца поймёте, как работают алгоритмы ML под капотом.
🗓️ Старт — 6 ноября
👉 Записаться на курс
👍1
📰 Новости недели
Новости и материалы прошедших 7 дней.
— Windows 10 больше не получит обновлений
— 50 клише для резюме
— Как вайб-кодинг меняет рынок IT-образования
— .NET 10 rc2
— Октябрьские обновления безопасности
🐸 Библиотека шарписта
#async_news
Новости и материалы прошедших 7 дней.
— Windows 10 больше не получит обновлений
— 50 клише для резюме
— Как вайб-кодинг меняет рынок IT-образования
— .NET 10 rc2
— Октябрьские обновления безопасности
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
⏰ Сегодня последний день!
🎁 Только при оплате до 19 октября — курс «Базовая математика» в подарок!
Успей попасть на экспресс-курс «Математика для Data Science» — 10 живых вебинаров, практика на Python, поддержка менторов и преподаватели из ВШЭ, Яндекс Практикума и Wildberries.
За 2 месяца разберёшься с тем, на чём держится Data Science:
🎓 Построишь математический фундамент и поймёшь, как работают алгоритмы ML под капотом.
👉 Записаться на курс
Старт — 6 ноября, не упусти бонус!🎁
🎁 Только при оплате до 19 октября — курс «Базовая математика» в подарок!
Успей попасть на экспресс-курс «Математика для Data Science» — 10 живых вебинаров, практика на Python, поддержка менторов и преподаватели из ВШЭ, Яндекс Практикума и Wildberries.
За 2 месяца разберёшься с тем, на чём держится Data Science:
• векторы, матрицы и регрессия;
• градиенты, оптимизация, вероятности и статистика;
• реальные задачи анализа данных;
🎓 Построишь математический фундамент и поймёшь, как работают алгоритмы ML под капотом.
👉 Записаться на курс
Старт — 6 ноября, не упусти бонус!🎁
🥱3❤1🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23😁11❤3💯3
Чтобы не упасть на удалении пробелов по краям строки можно использовать ванлайнер:
var clean = input?.Trim() ?? string.Empty;
•
?.
вызывает Trim()
только если input не null, иначе возвращает null•
??
подставляет пустую строку, если результат nullИтог: строка очищена от пробелов, либо получаем пустую строку — без риска.
Откройте своим друзьям путь в айти с помощью нашего курса по основам IT для непрограммистов. До конца октября со скидкой!
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱23👍7❤3
Дан массив цен акций по дням. Нужно найти максимальную прибыль, совершая любое количество сделок купли-продажи. Одновременно можно держать только одну акцию.
Пример:
Цены: [7, 1, 5, 3, 6, 4]
Ответ: 7
Покупаем за 1, продаём за 5 (прибыль 4). Покупаем за 3, продаём за 6 (прибыль 3). Итого — 7.
Алгоритм
Самый простой подход — жадный алгоритм. Если завтра цена выше, чем сегодня — покупаем сегодня и продаём завтра. Собираем прибыль с каждого роста цены.
Представьте график цен: вам нужно получить прибыль со всех участков, где график идёт вверх. Неважно, сколько это будет сделок — каждый рост приносит деньги.
Почему это работает
Если цена растёт три дня подряд (например, 1 → 3 → 5), то неважно, продавать ли каждый день или держать до конца.
Код:
public class Solution
{
public int MaxProfit(int[] prices)
{
if (prices == null || prices.Length < 2)
return 0;
int totalProfit = 0;
for (int i = 1; i < prices.Length; i++)
{
// Если цена выросла — берём эту прибыль
if (prices[i] > prices[i - 1])
{
totalProfit += prices[i] - prices[i - 1];
}
}
return totalProfit;
}
}
Или ещё компактнее:
public class Solution
{
public int MaxProfit(int[] prices)
{
int profit = 0;
for (int i = 1; i < prices.Length; i++)
{
profit += Math.Max(0, prices[i] - prices[i - 1]);
}
return profit;
}
}
Жадный подход здесь безупречен: захватываем каждый рост, игнорируем падения. Никаких сложных расчётов оптимальных точек — только простая логика и максимальная прибыль.
Чтобы щёлкать такие задачи нужно знать алгоритмы. Подтянуть такую базу поможет наш курс по алгоритмам. До конца октября скидка 40%
#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6👍1
Представьте: у вас API со списком заказов. Клиент может сортировать по любому полю через параметры запроса. Без динамики пришлось бы писать switch на все варианты:
IQueryable<Order> query = context.Orders;
query = sortBy switch
{
"total_asc" => query.OrderBy(o => o.TotalAmount),
"total_desc" => query.OrderByDescending(o => o.TotalAmount),
"date_asc" => query.OrderBy(o => o.CreatedAt),
"date_desc" => query.OrderByDescending(o => o.CreatedAt),
// ещё 20 полей...
};
С динамической сортировкой код становится лаконичным:
var orders = context.Orders
.Where(o => o.Status == OrderStatus.Completed)
.OrderBy("TotalAmount DESC")
.ThenBy("CreatedAt ASC");
Имя поля и направление сортировки передаются строкой. Всё остается IQueryable — запрос уходит в базу, а не выполняется в памяти.
Можно комбинировать несколько уровней сортировки, передавая массив строк от клиента.
Если строка сортировки приходит от пользователя, нужна валидация. Иначе можно получить exception на несуществующем поле или, хуже, уязвимость.
Попробовать либу:
dotnet add package System.Linq.Dynamic.Core
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔12❤9👍2
Вакансий для программистов стало на 17% меньше, резюме — на 25% больше. Рынок изменился: теперь это не «рынок кандидата», а «рынок работодателя».
В статье про то, что происходит с зарплатами, какие специалисты сейчас наиболее востребованы и почему одного знания языка уже недостаточно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
🔥 Когда понимаешь SOLID — жизнь становится проще
В октябре действует скидка 40% на все курсы от Proglib Academy, включая интенсив «Архитектуры и шаблоны проектирования»
📘 На интенсиве ты:
— разберёшься, как проектировать приложения, которые не ломаются при каждом изменении;
— освоишь SOLID-принципы, IoC, адаптеры и фабрики;
— научишься строить масштабируемые архитектуры;
— создашь собственную игру «Звёздные войны».
👨💻 Примеры кода на C#, Java, Python, PHP, C++ и JavaScript. Главное — понимать принципы, а не язык.
Преподаватель — Евгений Тюменцев, директор компании HWdTech, разрабатывал многопоточные кроссплатформенные приложения для IBM Watson.
📆 Формат: онлайн, 1 месяц.
📚 9 лекций + 2 бонусных занятия + практика.
Интенсив подойдёт джунам, которые хотят апнуться до мидла, и мидлам, мечтающим о роли архитектора.
👉 Переходи к курсам со скидкой 40%
В октябре действует скидка 40% на все курсы от Proglib Academy, включая интенсив «Архитектуры и шаблоны проектирования»
📘 На интенсиве ты:
— разберёшься, как проектировать приложения, которые не ломаются при каждом изменении;
— освоишь SOLID-принципы, IoC, адаптеры и фабрики;
— научишься строить масштабируемые архитектуры;
— создашь собственную игру «Звёздные войны».
👨💻 Примеры кода на C#, Java, Python, PHP, C++ и JavaScript. Главное — понимать принципы, а не язык.
Преподаватель — Евгений Тюменцев, директор компании HWdTech, разрабатывал многопоточные кроссплатформенные приложения для IBM Watson.
📆 Формат: онлайн, 1 месяц.
📚 9 лекций + 2 бонусных занятия + практика.
Интенсив подойдёт джунам, которые хотят апнуться до мидла, и мидлам, мечтающим о роли архитектора.
👉 Переходи к курсам со скидкой 40%
❤1👍1😁1
Когда вы работаете с делегатами в C#, есть одна особенность, которая может превратить обычный делегат в мощный инструмент. Речь о multicasting — возможности связать с одним делегатом сразу несколько методов.
Представьте, что у вас есть делегат. Обычно он указывает на один метод. Но в C# делегаты можно комбинировать:
public delegate void NotifyHandler(string message);
NotifyHandler handler = LogToConsole;
handler += SendEmail;
handler += SaveToDatabase;
handler("Пользователь авторизовался");
Когда вы вызовете handler, все три метода выполнятся последовательно. Именно эта возможность называется мультикаст.
Основной сценарий — реализация паттерна Observer без лишних сложностей. Вы подписываете несколько обработчиков на одно событие, и все они получают уведомление.
Важные детали
• Методы вызываются в том порядке, в котором вы их добавили. Но полагаться на конкретный порядок — плохая практика. Ваши обработчики должны быть независимыми.
• Если делегат возвращает значение, вы получите результат только от последнего метода в цепочке.
• Если один из методов выбросит исключение, остальные не выполнятся.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🥱2❤1👍1
💻 3 ядра 3 гига
Каждому разрабу нужно только одно — рабочий компьютер. У каждого он свой. На винде, на линуксе или может даже на макОси.
💬 Какой у вас сетап? Сколько ядер? Какая видеокарта? Хвастайтесь своими машинками в комментах 👇
🐸 Библиотека шарписта
#entry_point
Каждому разрабу нужно только одно — рабочий компьютер. У каждого он свой. На винде, на линуксе или может даже на макОси.
💬 Какой у вас сетап? Сколько ядер? Какая видеокарта? Хвастайтесь своими машинками в комментах 👇
#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Please open Telegram to view this post
VIEW IN TELEGRAM
😁31❤11👍1
Помните те времена, когда каждый метод начинался с целой простыни проверок входных параметров? Копипаста
if (string.IsNullOrEmpty(...))
была ежедневной рутиной:public void ProcessUser(string name, string email, int age)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentException("Value cannot be null or empty.", nameof(name));
if (string.IsNullOrEmpty(email))
throw new ArgumentException("Value cannot be null or empty.", nameof(email));
if (age < 0)
throw new ArgumentOutOfRangeException(nameof(age), "Value must be non-negative.");
// Наконец-то бизнес-логика!
}
Код становился шумным, а реальная логика терялась в океане проверок. Каждый разработчик писал по-своему, сообщения об ошибках отличались, а про опечатки в
nameof()
вообще молчим.Теперь всё это превращается в лаконичные однострочники:
public void ProcessUser(string name, string email, int age)
{
ArgumentException.ThrowIfNullOrEmpty(name);
ArgumentException.ThrowIfNullOrEmpty(email);
ArgumentOutOfRangeException.ThrowIfNegative(age);
}
Стандартная библиотека предлагает методы на все случаи жизни:
// Проверки на null
ArgumentNullException.ThrowIfNull(user);
// Числовые диапазоны
ArgumentOutOfRangeException.ThrowIfNegative(temperature);
ArgumentOutOfRangeException.ThrowIfZero(divisor);
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(count);
// Сравнения
ArgumentOutOfRangeException.ThrowIfGreaterThan(progress, 100);
ArgumentOutOfRangeException.ThrowIfLessThan(quantity, 1);
ArgumentOutOfRangeException.ThrowIfEqual(status, Status.Invalid);
ArgumentOutOfRangeException.ThrowIfNotEqual(version, expectedVersion);
Эти методы — не просто синтаксический сахар. Они воплощают принцип fail-fast: обнаруживай проблемы немедленно, не позволяй невалидным данным распространяться по системе.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23❤4❤🔥2🤔2🥱2
💥 Октябрь — месяц апгрейда!
До конца этого месяца действует скидка 40% на все курсы Proglib Academy(кроме AI-агентов, ML для старта и математики) .
Под акцию попал и наш хит — курс «Алгоритмы и структуры данных».
👨💻 Он подойдёт джунам, мидлам и всем, кто хочет писать код осознанно, а не наугад.
👨🏫 Преподаватели — инженеры из Яндекса и ВШЭ.
🎓 Сертификат по итогам обучения — в портфолио.
➖ 47 видеоуроков и 150 практических задач;
➖ поддержка преподавателей и чат;
➖ доступ к материалам на 12 месяцев.
Полная программа курса тут 👈
👉 Остальные курсы
До конца этого месяца действует скидка 40% на все курсы Proglib Academy
Под акцию попал и наш хит — курс «Алгоритмы и структуры данных».
👨💻 Он подойдёт джунам, мидлам и всем, кто хочет писать код осознанно, а не наугад.
👨🏫 Преподаватели — инженеры из Яндекса и ВШЭ.
🎓 Сертификат по итогам обучения — в портфолио.
➖ 47 видеоуроков и 150 практических задач;
➖ поддержка преподавателей и чат;
➖ доступ к материалам на 12 месяцев.
Полная программа курса тут 👈
👉 Остальные курсы
❤1
Метод Enum.TryParse кажется идеальным инструментом для безопасного парсинга строк в enum — он не бросает исключения и возвращает bool, сигнализируя об успехе или неудаче операции.
Но у этого метода есть неочевидное поведение, которое может привести к багам.
Представьте ситуацию: пользователь передаёт статус заказа через API, вы парсите его через
TryParse
, получаете true, уверенно обрабатываете заказ... и внезапно обнаруживаете в базе статус со значением 999, которого в вашем енаме вообще не существует.Enum.TryParse
возвращает true даже для несуществующих значений enum:public enum OrderType
{
Cool = 0,
NotCool = 1
}
// Парсим значение, которого НЕТ в enum
Enum.TryParse("999", out OrderType type);
// ✓ Вернёт TRUE
// ✓ day = (OrderType)999
// ✗ Но 999 не определён в OrderType!
Console.WriteLine($"Результат: {type}"); // Вывод: 999
TryParse
проверяет только возможность конвертации строки в числовой тип, а не валидность значения для конкретного enum.Решение
Добавьте проверку через Enum.IsDefined:
if (Enum.TryParse("999", out OrderType type) &&
Enum.IsDefined(typeof(OrderType), type))
{
// Здесь значение гарантированно валидно
} else {
// 999 будет правильно отклонено
}
Enum.IsDefined
использует рефлексию и может быть медленным в hot path. Альтернативы:
// Для hot path: кешируем валидные значения
private static readonly HashSet<OrderType> ValidValues =
new(Enum.GetValues<OrderType>());
public static bool IsValid(OrderType value) =>
ValidValues.Contains(value); // Быстрее IsDefined
// Для непрерывных enum: проверка диапазона
public static bool IsValid(OrderType value) =>
(int)value >= 0 && (int)value <= 1; // Самый быстрый
Microsoft спроектировали это так намеренно, поскольку C# позволяет приводить любое число к типу енамки без ограничений. Это даёт гибкость, но требует от разработчика дополнительной бдительности.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩9👍4😁1