Библиотека шарписта | C#, F#, .NET, ASP.NET
21.7K subscribers
2.89K photos
45 videos
91 files
5.35K links
Все самое полезное для C#-разработчика в одном канале.

Наши курсы: https://clc.to/y3LDtw

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
Самая дорогая часть агентной разработки — не всегда код 🥳
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
😱 Знакомо? Лимит уже закончился, а задача всё ещё не готова. Часть токенов могла уйти на повторное чтение файлов, лишний контекст и неудачные попытки.

⚡️ Этому посвящён отдельный блок курса «ИИ для разработчиков». Вы разберёте расходы на собственных проектах, сравните подходы и найдёте места, где агент выполняет лишнюю работу.

В итоге станет понятнее, сколько ресурсов выделять на запуск, когда его останавливать и в какой момент лучше изменить подход 🔍


До 31 июля курс можно купить со скидкой, а все материалы останутся в бессрочном доступе.

🔗 Узнать подробности о курсе

🏃‍♀️ Proglib Academy
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3💯1
😑 Мокать зависимости или тестировать на настоящих?

Один из главных споров в тестировании.

Одни мокают почти всё вокруг проверяемого класса. Такие тесты быстрые, изолированные и падают только из-за логики самого кода.


Другие предпочитают реальные зависимости: базу в контейнере, настоящие сервисы и интеграционные сценарии. Да, такие тесты медленнее, зато они лучше показывают, как код ведёт себя в реальных условиях.


На практике многие выбирают компромисс: внешние API и нестабильные сервисы мокают, а свои компоненты стараются тестировать вместе.

💬 А как у вас?

👍 — максимум моков, главное скорость и изоляция.
🔥 — минимум моков, лучше реальные зависимости.

📍 Навигация: ВакансииЗадачиСобесы

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

#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍84
💡 Компилируйте регулярки заранее

Обычный new Regex("...") разбирает шаблон при первом использовании уже во время работы программы. Если регулярное выражение используется часто, это лишние накладные расходы, а ошибки в шаблоне обнаружатся только в рантайме.

В .NET 7 появился атрибут [GeneratedRegex]. Достаточно объявить частичный метод, а генератор исходного кода создаст реализацию ещё на этапе сборки.


Если шаблон известен заранее и используется регулярно, выбирайте [GeneratedRegex]. Если регулярное выражение приходит от пользователя или из конфигурации во время работы программы — остаётся обычный Regex.

📍 Навигация: ВакансииЗадачиСобесы

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍184
Как устроен пул потоков и почему его нельзя блокировать

Большая часть CPU-bound работы и продолжений после await в .NET выполняется на потоках из ThreadPool. Именно поэтому проблемы с производительностью часто начинаются здесь.

➡️ Пул хранит набор рабочих потоков и несколько очередей задач. У каждого потока есть своя локальная очередь, а также существует общая. Если поток остаётся без работы, он может забирать задачи из очередей других потоков. Этот механизм называется work stealing и помогает равномерно загружать все ядра.

Главное правило — не блокируйте потоки пула. Когда код вызывает .Result или .Wait() для незавершённой задачи, поток простаивает, но остаётся занятым.

Если таких потоков становится много, возникает голодание пула (ThreadPool starvation): новые задачи ждут свободных потоков, а приложение начинает «подвисать».


Пул умеет создавать новые потоки, но делает это постепенно, чтобы не тратить ресурсы впустую. Поэтому большое количество блокирующих вызовов особенно болезненно.

💡 Используйте await вместо .Result и .Wait(), а длительную блокирующую работу не держите на потоках пула. Это поможет избежать голодания и сохранить отзывчивость приложения.

📍 Навигация: ВакансииЗадачиСобесы

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

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Какая концепция C# позволяет объекту принимать различные формы и, следовательно, отображать соответствующее поведение?

👾 — Полиморфизм
👍 — Инкапусляция
🥰 — Абстракция
⚡️ — Ничего из вышеперечисленного

Библиотека задач по C#
👾141🥱73👍2🤩1
🚀 Анализ изменений с git log

Команда git log позволяет понять, как эволюционировал код — просмотреть последовательность коммитов и метаданные.

Просмотр истории:


git log


История коммитов построчно:


git log --oneline


Граф веток + метки (ветки, теги) для всех веток:


git log --graph --decorate --all


Показать diff последних двух коммитов:


git log -p -2


Коммиты за последние 2 недели от указанного автора:


git log --since="2 weeks ago" --author="ProgLib»


Настраиваемый формат: короткий хеш, дата, сообщение, автор:


git log --pretty=format:"%h %ad | %s%d [%an]" --date=short


💬 Вы смотрите историю log'ом или используете сторонние инструменты?

📍 Навигация: ВакансииЗадачиСобесы

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱63👍3
🧑‍💻 Сёрфить .NET без Blazor

Можно ли запустить .NET-приложение в браузере без Blazor? Да, существуют несколько альтернативных методов, которые могут подойти для различных проектов.

Один из таких методов — это WebAssembly. Эта технология позволяет компилировать .NET-код в байткод, который выполняется в браузере. Однако WebAssembly не поддерживает все возможности .NET, а настройка может быть сложной.

Если нужна большая гибкость, можно использовать JavaScript Interop. Этот подход позволяет обмениваться данными между JavaScript и .NET, что дает возможность интегрировать их в одно приложение.

Это решение для тех, кто хочет сохранить существующий JavaScript-код, но при этом использовать возможности .NET в клиентской части.

Также можно использовать инструменты вроде Mono и CoreRT для компиляции .NET-приложений в WebAssembly, или платформы, такие как Ooui и Uno Platform, которые упрощают перенос .NET-кода в браузер.

➡️ Подробнее про запуск с WebAssembly можно почитать в статье

📍 Навигация: ВакансииЗадачиСобесы

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

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
💡 EF Core научился переводить FullJoin в FULL OUTER JOIN

В .NET 11 Preview 6 EF Core получил поддержку трансляции нового LINQ-оператора FullJoin в SQL. Теперь запросы могут выполняться целиком на стороне базы данных, без ручных обходных решений.

Сам оператор FullJoin появился в .NET 11 раньше, но сначала работал только для LINQ to Objects. Теперь EF Core умеет преобразовывать его в FULL OUTER JOIN для реляционных провайдеров, которые поддерживают этот оператор.

Это удобно для задач, где нужно сохранить все строки из обеих таблиц, включая несовпавшие: поиск расхождений, сверка данных, объединение нескольких источников или построение отчётов.

Раньше такие запросы часто приходилось собирать вручную из нескольких JOIN и UNION либо писать сырой SQL.

⚠️ Пока это часть .NET 11 Preview 6. До финального релиза в ноябре поведение ещё может измениться.

📍 Навигация: ВакансииЗадачиСобесы

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

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍5
Server GC или Workstation GC. Что выбрать?

В .NET сборщик мусора работает в двух режимах, и выбор между ними влияет на производительность приложения.

Workstation GC рассчитан на клиентские приложения. Он экономнее расходует память и старается не занимать все доступные ядра.

➡️ Server GC ориентирован на высокую нагрузку. Он использует несколько управляемых куч и потоков GC, что позволяет эффективнее справляться с большим количеством аллокаций на многоядерных машинах. Цена — более высокое потребление памяти.

Ещё одна особенность — Background GC. Во время сборки старших поколений он позволяет сократить длительные паузы, выполняя значительную часть работы параллельно с приложением.


Server GC настраивается через свойство ServerGarbageCollection, хотя многие серверные шаблоны уже используют его по умолчанию.

📍 Навигация: ВакансииЗадачиСобесы

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

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Кажется, у онлайн-обучения появился формат, которого давно не хватало 👇
🤔 У большинства разработчиков уже есть подписки на IDE, GitHub Copilot, Claude, ChatGPT или облачные сервисы.

Логично, что обучение тоже постепенно приходит к той же модели: не покупать отдельный курс под каждую новую тему, а иметь доступ ко всей библиотеке и выбирать, что актуально именно сейчас.


Такой формат недавно появился и в Proglib Academy. Вместо одного курса — доступ сразу ко всей библиотеке и новым материалам, которые появляются в подписке 😎

🔗 Подробнее

🏃‍♀️ Proglib Academy
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3🥱3
🔥 Где должна жить бизнес-логика: в хранимых процедурах или в коде приложения?

Спор, который не утихает много лет.

Сторонники хранимых процедур говорят: данные уже в базе, меньше сетевых запросов, выше производительность и больше контроля над SQL.

Сторонники логики в приложении отвечают: код проще тестировать, ревьюить, версионировать в Git и переносить между разными СУБД.


На практике многие выбирают компромисс: сложные операции над большими объёмами данных оставляют в базе, а бизнес-правила и оркестрацию — в приложении.

💬 А как устроено у вас?

👍 — максимум логики в приложении.
🔥 — сложную логику лучше держать в базе.

И был ли у вас проект, где сотни хранимых процедур со временем превратились в «чёрный ящик», который никто не хотел менять?

📍 Навигация: ВакансииЗадачиСобесы

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

#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥15
💎 Вспоминаем SOLID

SOLID — это 5 принципов объектно-ориентированного проектирования. Давайте повторим эту базу.

— Single Responsibility Principle (Принцип единственной ответственности)

Каждый класс должен иметь только одну причину для изменения.

Плохо: класс UserManager и сохраняет пользователя в БД, и отправляет email.
Хорошо: UserRepository хранит, EmailService отправляет письма.

Open/Closed Principle (Принцип открытости/закрытости)

Классы должны быть открыты для расширения, но закрыты для изменения.

Новый функционал добавляем через расширение, а не переписывание старого кода.

Пример: вместо переписывания метода — создаём новый подкласс или внедряем стратегию.

Liskov Substitution Principle (Принцип подстановки Барбары Лисков)

Объекты подклассов должны работать так же, как объекты родителя.

Если Square наследуется от Rectangle, он должен вести себя как прямоугольник, а не ломать ожидания.

Суть: наследование не должно рушить логику программы.

— Interface Segregation Principle (Принцип разделения интерфейсов)

Лучше много маленьких интерфейсов, чем один огромный.

Плохо: интерфейс IMachine с методами print(), scan(), fax().
Хорошо: IPrinter, IScanner, IFax. Каждый класс реализует только нужное.

— Dependency Inversion Principle (Принцип инверсии зависимостей)

Зависимости должны быть от абстракций, а не от конкретных классов.

Плохо: класс ReportGenerator напрямую вызывает MySQLDatabase.
Хорошо: ReportGenerator работает с интерфейсом Database, а уже конкретная БД подставляется снаружи.

Без SOLID код быстро превращается в спагетти, где одно изменение ломает всё.

📍 Навигация: ВакансииЗадачиСобесы

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

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍215🔥3🥰1👏1
👨‍💻 Мгновенная валидация кода

В стремительном темпе разработки важно улавливать ошибки сразу же после правки.

Представьте, что можно запускать тесты каждый раз, когда вы сохраняете файл — без лишних кликов и ожидания.

Команда дня:


dotnet watch test --filter "Category=Unit»


Эта команда активирует «наблюдение» за исходниками проекта и при каждом изменении автоматически запускает только те тесты, которые помечены категорией Unit.

Вы сразу увидите результаты проверки критичных компонентов, не тратя время на полную прогонку всех тестов.

Если вы хотите параллельно следить и за интеграционными тестами, достаточно изменить фильтр:


dotnet watch test --filter "Category=Integration»


Ещё и интегрировать со скриптами и конвейерами проще простого.

📍 Навигация: ВакансииЗадачиСобесы

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥92
📌 Версии версионирования

Какую систему нумерации версий предпочитаете и встречали ли экзотические варианты? Делитесь опытом👇

📍 Навигация: ВакансииЗадачиСобесы

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

#схема
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
👍 Современные помощники для валидации параметров

Помните те времена, когда каждый метод начинался с целой простыни проверок входных параметров? Копипаста 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
👍247👾4❤‍🔥1