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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
⌨️ Создание alias для частых команд

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

Например, вместо длинного git log --oneline --graph --all --decorate, можно настроить удобный git lg, который покажет красивую и наглядную историю коммитов:

Вот как это сделать:
git config --global alias.lg "log --oneline --graph --all --decorate"


Теперь git lg покажет красивую историю коммитов.

💬 Пользуетесь алиасами? Какие вводите чаще всего? Делитесь в комментариях 👇

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥3
Чек-лист: правильное использование LINQ в C#

Этот чек-лист поможет вам писать чистый и оптимальный LINQ-код без лишних операций и ошибок:

Основные принципы LINQ
✓ Понимать разницу между IEnumerable<T> и IQueryable<T>
✓ Фильтровать (Where()) данные как можно раньше в цепочке вызовов.
✓ Извлекать (Select()) только нужные поля, а не всю сущность.
✓ Использовать Any() вместо Count() > 0 для проверки наличия элементов.
✓ Избегать многократных проходов по коллекции (повторных .Where(), .Select())
✓ Знать разницу между отложенным и немедленным выполнением.

Работа с Where, Select, FirstOrDefault
✓ Не использовать Where().FirstOrDefault() – просто FirstOrDefault().
✓ Вызывать Where() перед Select(), а не наоборот.
✓ Использовать FirstOrDefault(predicate), если проверяется только одно значение.

Nullable
✓ Использовать ?? для значений, которые могут быть null.
✓ Использовать DefaultIfEmpty() при GroupBy().

Избегание дублирующих данных
✓ Использовать Distinct() для уникальных значений.
✓ Использовать Union() для объединения без дубликатов.
✓ Использовать Except() и Intersect() для разницы между коллекциями.

Помните, что LINQ — это не просто удобство, а инструмент, требующий понимания его тонкостей.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍268🥱4🔥2
Всё ещё пишете на Entity Framework или уже перешли на Dapper

EF, Dapper, ADO.NET… ORM vs чистый SQL – споры не утихают!

💭 Кто-то остаётся на EF Core, потому что удобство важнее всего.
🚀 Кто-то выбирает Dapper ради скорости и контроля.
⚖️ А кто-то комбинирует оба подхода, используя сильные стороны каждого.

А какой ваш путь? Почему именно этот инструмент, что помогло, а что оказалось головной болью? Делитесь в комментах! 👇

🐸Библиотека шарписта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔7👍6😢2👾1
⭐️ Новый выпуск .NET Rocks

C# 13 уже на горизонте! Какие изменения нас ждут, и стоит ли разработчикам опасаться очередного «революционного» обновления? В новом выпуске подкаста .NET Rocks! ведущий архитектор C#, раскрывает детали будущего языка.

🧐 О чем выпуск

• Будущее C# — какие новые возможности появятся в C# 13.

• Как Microsoft принимает решения о развитии языка.

• Как новые фичи повлияют на разработчиков.

Если вы работаете с .NET, этот выпуск точно стоит послушать.

➡️ Слушать подкаст

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱5
Нужна ли математика программисту

Можно ли стать разработчиком, если в школе ненавидел математику? А если наоборот — тащился от алгебры и геометрии, но кодить не умеешь? Эта статья раскладывает всё по полочкам: где без математики никуда, а где можно и без неё.

➡️ Что внутри:

✓ Почему все считают, что программисты — математики

✓ В каких сферах разработки можно вообще не знать математику

✓ Где хватит готовых библиотек, а где придётся разбираться в формулах

✓ Какие области программирования требуют мощного математического бэкграунда

✓ Что делать, если математика — это боль, но хочется освоить ML или Data Science

✓ Топ книг, которые помогут понять и даже полюбить математику

🔵 Чтобы знать математику, забирайте наш курс → «Математика для Data Science»

📎 Читать статью

Proglib Academy
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Любите делать техдолг?

🐸Библиотека шарписта #развлекалово
Please open Telegram to view this post
VIEW IN TELEGRAM
😁17💯4👍1
🚀 CQRS, DDD, Event Sourcing — мощные паттерны или способ усложнить жизнь

В мире .NET (и не только) многие разработчики рано или поздно сталкиваются с модными архитектурными подходами: CQRS, DDD и Event Sourcing. Но где проходит граница между «правильной» архитектурой и бессмысленным оверинжинирингом.

💬 Как думаете, эти патерны — must-have или бесполезный оверхед? Делитесь своим опытом! 👇

🐸Библиотека шарписта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11👍3
📰 Еженедельный дайджест

Что произошло за прошедшую неделю марта:

EF Core 9 в MongoDB — в MongoDB обновили провайдер для Entity Framework Core, добавив совместимость с EF Core 9.

Новый формат файлов решений в .NET — В .NET представлена поддержка нового XML-формата файлов решений — SLNX.

Сервисные обновления .NET — Microsoft выпустила мартовские обновления для .NET 8.0 и 9.0, устраняющие уязвимость повышения привилегий (CVE-2025-24070)

ТОП-30 вопросов и ответов для собеседований в 2025 году — собрали для вас самые частые вопросы со структурами данных.

🐸Библиотека шарписта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Как устроены поколения в сборке мусора

Garbage Collector (GC) в .NET работает по поколенческой (generational) модели и использует три поколения, нумеруемые от 0.

1️⃣ Gen 0 (Первое поколение)

• В этом поколении создаются новые объекты.
• Сборки происходят часто, но занимают мало времени.
• Если объект переживает сборку мусора, он перемещается в Gen 1.

Очистка происходит когда выделено определенное количество памяти или когда в системе недостаточно памяти.

2️⃣ Gen 1 (Второе поколение)

• Содержит объекты, которые выжили после очистки Gen 0.
• Используется как буфер перед Gen 2.
• Очистка Gen 1 происходит реже, чем Gen 0.

Очистка происходит когда Gen 0 заполняется, и GC не смог освободить достаточно памяти.

3️⃣ Gen 2 (Третье поколение)

• Включает долгоживущие объекты, например, кеш, синглтоны.
• Очистка происходит редко и занимает больше времени.
• Все объекты, пережившие сборку в Gen 1, перемещаются в Gen 2.

Очистка происходит, когда в системе не хватает памяти.

А также есть LOH (Large Object Heap) – специальная область для больших объектов. В нём очистка очень редкая и дорогостоящая.

Чем меньше объектов доживает до Gen 2, тем лучше работает GC.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🤔21
Количество уникальных букв в строке

1. Создаем строку str, которую нужно проанализировать.
2. Применяем метод Distinct() для получения уникальных символов в строке.
3. Вызываем метод Count() для получения количества элементов в последовательности уникальных символов.
4. Добавляем параметр char.IsLetter, чтобы учитывать только буквы алфавита.
😁25🥱8🔥6🤔1😍1
📝 Visual Studio теперь сам пишет комментарии

Microsoft представила автоматическую генерацию комментариев в Visual Studio с помощью GitHub Copilot.

Теперь, просто введя /// перед методом, можно получить готовое описание его работы, параметров и возвращаемого значения.

• Доступно в Visual Studio 17.14 Preview 2.

➡️ Подробнее в блоге разработчиков

Как думаете, полезно или лучше вообще не писать комментарии? 💬

🐸Библиотека шарписта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍40👏43😁2🔥1
🐧 Пингвин, покоривший мир: история взлета Linux – ОС, управляющей 96% серверов

В 1991 году на компьютере с 4 мегабайтами памяти родилась программа, которая сегодня управляет большей частью интернета, смартфонами и даже космическими аппаратами. Это история Linux, рассказанная одним из первых свидетелей.

➡️ Читать статью
➡️ Зеркало
👍4🌚3😁1
💾 Шпаргалка по C#

Все важные моменты в одном репозитории. Сохраняйте себе в закладки.

➡️ Репозиторий со шпаргалкой

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👾4🤔1
🎮💾 Оптимизация памяти в Unity: как избежать лагов и повысить FPS в играх

Оптимизация памяти в Unity — ключ к стабильной работе игр. Если хочется избежать лагов и повысить FPS, важно правильно управлять памятью. Использование эффективных методов загрузки и выгрузки данных, уменьшение количества аллокаций и грамотное применение сборщика мусора помогут улучшить производительность и стабильность игры.

➡️ Подробнее в статье

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
⚙️ Передаём данные между потоками

В C# есть несколько способов передать данные из одного потока в другой. Выбор зависит от требований к производительности, удобству и безопасности. Несколько распространенных вариантов:

1️⃣ Использование BlockingCollection<T>

Это потокобезопасная коллекция, позволяющая передавать данные от одного потока к другому.
var collection = new BlockingCollection<int>();

// Поток-поставщик (Producer)
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
collection.Add(i);
Console.WriteLine($"Производитель: добавил {i}");
Thread.Sleep(500);
}
collection.CompleteAdding();
});

// Поток-потребитель (Consumer)
Task.Run(() =>
{
foreach (var item in collection.GetConsumingEnumerable())
{
Console.WriteLine($"Потребитель: получил {item}");
}
}).Wait();


2️⃣ Использование TaskCompletionSource<T>

Когда нужно передать значение между потоками в будущем.

var tcs = new TaskCompletionSource<int>();

// Поток-поставщик
Task.Run(() =>
{
Thread.Sleep(2000);
tcs.SetResult(42);
});

// Поток-потребитель
int result = await tcs.Task;
Console.WriteLine($"Получено: {result}");


3️⃣ Использование ConcurrentQueue<T>

Если нужно неблокирующее хранилище данных.

var queue = new ConcurrentQueue<int>();

// Поток-поставщик
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
queue.Enqueue(i);
Console.WriteLine($"Добавлено {i}");
Thread.Sleep(500);
}
});

// Поток-потребитель
Task.Run(() =>
{
while (true)
{
if (queue.TryDequeue(out int item))
{
Console.WriteLine($"Получено {item}");
}
Thread.Sleep(100);
}
}).Wait();


4️⃣ Использование Channel<T> (System.Threading.Channels)

Альтернативный подход к BlockingCollection<T>

var channel = Channel.CreateUnbounded<int>();

// Поток-поставщик
_ = Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
await channel.Writer.WriteAsync(i);
Console.WriteLine($"Производитель: {i}");
await Task.Delay(500);
}
channel.Writer.Complete();
});

// Поток-потребитель
await foreach (var item in channel.Reader.ReadAllAsync())
{
Console.WriteLine($"Потребитель: {item}");
}


💬 Какой вариант вам больше всего понравился?

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

В нашем чате работает бот Shieldy — он защищает от спама, запрашивая у новых участников решение простой капчи.

⚠️ Проблема, с которой сталкиваются многие: вы нажимаете под постом «Прокомментировать», пишете что-то, а потом получаете бан и не можете писать комментарии.

Почему так: Shieldy отправляет капчу в сам чат, а не в комментарии под конкретный пост. Из-за этого капчу можно не увидеть, не отправить ответ на нее, и бот автоматически заблокирует вас.

Как присоединиться к чату, чтобы бот вас не забанил

— Зайдите в описание канала с телефона и нажмите кнопку Discuss / Чат
— Нажмите Join / Присоединиться
— Сразу обратите внимание на сообщение от бота Shieldy
— Решите простой пример и отправьте ответ в чат

После этого бот отправит приветственное сообщение и вы сможете оставлять комментарии. Эту проверку нужно пройти только один раз при вступлении в чат.

❗️ Если вас все-таки забанили

— Это временная блокировка на несколько минут
— Подождите и попробуйте зайти позже, бот снова отправит вам капчу

Админы канала никак не могут ускорить процесс, бот автоматически снимает с вас блокировку через пару минут. Мы понимаем, что эта система неидеальна, и ищем более удобное решение.

👾 Спасибо, что активно участвуете в обсуждении наших постов!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
😊 Промт дня: генератор регулярных выражений

Регулярные выражения это что-то на эльфийском. Вместо ручного написания попросите об этом нейросеть с помощью промта:
I want you to act as a regex generator. Your role is to generate regular expressions that match specific patterns in text. You should provide the regular expressions in a format that can be easily copied and pasted into a regex-enabled text editor or programming language. Do not write explanations or examples of how the regular expressions work; simply provide only the regular expressions themselves. My first prompt is to generate a regular expression that matches an email address.


В этом примере будет сгенерировано выражение, для матчинга email-адресов.

💬 Часто пишете регулярки? Делитесь в комментариях! 🚀


🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🥱12😁2👾1
🤯 Баги, которые IDE не смогла предсказать

Программисты доверяют своим инструментам, но иногда даже самая умная IDE оказывается бессильна перед хитроумными багами. Это те моменты, когда компилятор молчит, дебаггер пожимает плечами, а ты смотришь в монитор и думаешь: «Как так-то».

🛠 В Библиотеке программиста мы считаем, что самые крутые истории — это те, которые заставляют нас учиться. Делитесь своими случаями, когда:

— Компилятор не ругался, но всё работало "не так".
— Ошибка пряталась в очевидном месте, но её никто не замечал.
— Код выглядел идеально, но прод сказал: "ну ты и наделал..."
— Рефакторинг только ухудшил ситуацию.

Начнём с нашего админа:
Одной из моих первых фичей была отправка письма по шаблону. Отправку реализовал — с этим проблем не возникло. Добавил логирование, чтобы отслеживать какие письма кому идут. Так случилось, что на тестирование подзабили, потому что письма на тестовой среде не отправлялись. Вывели это в прод и оказалось, что ошибся в форматировании строки в логах... IDE как-то упустила этот момент, а мне зелёному хотелось поскорее увидеть плоды своего творения. В тот же день я и повёз свой первый хотфикс.


🐸Библиотека шарписта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1🥰1😁1