Библиотека шарписта | C#, F#, .NET, ASP.NET
22.6K subscribers
2.41K photos
39 videos
85 files
4.6K links
Все самое полезное для C#-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
💻 3 ядра 3 гига

Каждому разрабу нужно только одно — рабочий компьютер. У каждого он свой. На винде, на линуксе или может даже на макОси.

💬 Какой у вас сетап? Сколько ядер? Какая видеокарта? Хвастайтесь своими машинками в комментах 👇

🐸 Библиотека шарписта

#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
4
⚙️ Современные помощники для валидации параметров

Помните те времена, когда каждый метод начинался с целой простыни проверок входных параметров? Копипаста 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
👍234🥱4❤‍🔥2🤔2
💥 Октябрь — месяц апгрейда!

До конца этого месяца действует скидка 40% на все курсы Proglib Academy (кроме AI-агентов, ML для старта и математики).

Под акцию попал и наш хит — курс «Алгоритмы и структуры данных».

👨‍💻 Он подойдёт джунам, мидлам и всем, кто хочет писать код осознанно, а не наугад.

👨‍🏫 Преподаватели — инженеры из Яндекса и ВШЭ.

🎓 Сертификат по итогам обучения — в портфолио.

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
👍15🤩111😁1
⭐️ Подборка вакансий для шарпистов

С# разработчик на гибрид в СПБ.

Senior Backend Developer от 250 000 ₽.

Web-разработчик на C# с удалёнкой.

C# / .NET-разработчик на удалёнку.

Бустер — Удалённо (в любом городе мира).

➡️ Еще больше топовых вакансий — в нашем канале C# Jobs

🐸 Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🍩 Донат разработчикам

Microsoft запустили функцию спонсорства на NuGet.org для финансовой поддержки мейнтейнеров пакетов.

Владельцы пакетов добавляют ссылки через раздел "Manage Packages". Пользователи видят кнопку спонсорства и могут поддержать разработчиков напрямую.

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🎉32