23284
Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
🐸Библиотека шарписта #развлекалово
Читать полностью…
⚙️ Передаём данные между потоками
В 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();
var tcs = new TaskCompletionSource<int>();
// Поток-поставщик
Task.Run(() =>
{
Thread.Sleep(2000);
tcs.SetResult(42);
});
// Поток-потребитель
int result = await tcs.Task;
Console.WriteLine($"Получено: {result}");
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();
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}");
}
💾 Шпаргалка по C#
Все важные моменты в одном репозитории. Сохраняйте себе в закладки.
➡️ Репозиторий со шпаргалкой
🐸Библиотека шарписта #буст
📝 Visual Studio теперь сам пишет комментарии
Microsoft представила автоматическую генерацию комментариев в Visual Studio с помощью GitHub Copilot.
Теперь, просто введя /// перед методом, можно получить готовое описание его работы, параметров и возвращаемого значения.
• Доступно в Visual Studio 17.14 Preview 2.
➡️ Подробнее в блоге разработчиков
Как думаете, полезно или лучше вообще не писать комментарии? 💬
🐸Библиотека шарписта #свежак
Как устроены поколения в сборке мусора
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.
🐸Библиотека шарписта #буст
🚀 CQRS, DDD, Event Sourcing — мощные паттерны или способ усложнить жизнь
В мире .NET (и не только) многие разработчики рано или поздно сталкиваются с модными архитектурными подходами: CQRS, DDD и Event Sourcing. Но где проходит граница между «правильной» архитектурой и бессмысленным оверинжинирингом.
💬 Как думаете, эти патерны — must-have или бесполезный оверхед? Делитесь своим опытом! 👇
🐸Библиотека шарписта #междусобойчик
➕➖ Нужна ли математика программисту
Можно ли стать разработчиком, если в школе ненавидел математику? А если наоборот — тащился от алгебры и геометрии, но кодить не умеешь? Эта статья раскладывает всё по полочкам: где без математики никуда, а где можно и без неё.
➡️ Что внутри:
✓ Почему все считают, что программисты — математики
✓ В каких сферах разработки можно вообще не знать математику
✓ Где хватит готовых библиотек, а где придётся разбираться в формулах
✓ Какие области программирования требуют мощного математического бэкграунда
✓ Что делать, если математика — это боль, но хочется освоить ML или Data Science
✓ Топ книг, которые помогут понять и даже полюбить математику
🔵 Чтобы знать математику, забирайте наш курс → «Математика для Data Science»
📎 Читать статью
Proglib Academy
❓ Всё ещё пишете на Entity Framework или уже перешли на Dapper
EF, Dapper, ADO.NET… ORM vs чистый SQL – споры не утихают!
💭 Кто-то остаётся на EF Core, потому что удобство важнее всего.
🚀 Кто-то выбирает Dapper ради скорости и контроля.
⚖️ А кто-то комбинирует оба подхода, используя сильные стороны каждого.
А какой ваш путь? Почему именно этот инструмент, что помогло, а что оказалось головной болью? Делитесь в комментах! 👇
🐸Библиотека шарписта #междусобойчик
🐸Библиотека шарписта #развлекалово
Читать полностью…
📝 Структуры данных: ТОП-30 вопросов и ответов для собеседований в 2025 году
Техническое собеседование на позицию разработчика, дата-сайентиста и ML-инженера часто включает вопросы по структурам данных и связанным с ними алгоритмами.
В нашей статье мы рассмотрим базовые и продвинутые темы, разберем типичные задачи и обсудим оптимальные способы их решения.
📄 Прочитайте статью и укрепите свои знания — https://proglib.io/sh/1uYAygzIxr
Библиотека питониста
🚀 EF Core 9 в MongoDB
Отличные новости для .NET-разработчиков. MongoDB обновил провайдер для Entity Framework Core, добавив поддержку EF Core 9.
➡️ Подробнее про обновление
Если уже пробовали новую версию, делитесь впечатлениями 👇
🐸Библиотека шарписта #свежак
📰 Что произошло за неделю
Собрали для вас главные события и контент минувших семи дней.
🔄 Превью .NET 10 — Microsoft представили превью новой версии своего фреймворка.
⚡️ Visual Studio v17.13 — улучшения включают улучшенную поддержку отладки асинхронных стеков в профайлере .NET и лучшую визуализацию многопроцессорного выполнения.
📊 Итоги опроса про работу — Proglib проводили исследование о рынке труда. Самое время поделиться результатами.
🐸Библиотека шарписта #свежак
👶 Объясни как пятилетке: кэш
Задача: объясните простыми словами что такое кэширование так, чтобы понял даже пятилетний ребенок.
Например:
Представь, что ты любишь есть печенье, и оно хранится на кухне в большой банке. Каждый раз, когда тебе хочется печенье, ты бегаешь на кухню, открываешь банку, берёшь одно и возвращаешься. Но это долго и утомительно!
А теперь представь, что ты положил тарелочку с печеньем рядом с собой. Теперь, когда ты хочешь ещё одно печенье, тебе не нужно бежать на кухню – оно уже рядом!
Видели когда-нибудь SQL-инъекции?
🐸Библиотека шарписта #развлекалово
💬 Шаблон для своего чата с ИИ
Microsoft в новом превью представили шаблон для разработки чат-приложений c ИИ.
Шаблон позволяет создать интерфейс чата, который может взаимодействовать с образцами PDF-файлов или вашими собственными данными, используя паттерн Retrieval Augmented Generation (RAG).
Сгенерированный код включает UI-компоненты для взаимодействия в чате, отслеживания цитат и предложений для дальнейших действий.
🚀 Как начать
Достаточно установить шаблон командой:
dotnet new install Microsoft.Extensions.AI.Templates
💬 Как оставлять комментарии в чате нашего канала
В нашем чате работает бот Shieldy — он защищает от спама, запрашивая у новых участников решение простой капчи.
⚠️ Проблема, с которой сталкиваются многие: вы нажимаете под постом «Прокомментировать», пишете что-то, а потом получаете бан и не можете писать комментарии.
❓Почему так: Shieldy отправляет капчу в сам чат, а не в комментарии под конкретный пост. Из-за этого капчу можно не увидеть, не отправить ответ на нее, и бот автоматически заблокирует вас.
✅ Как присоединиться к чату, чтобы бот вас не забанил
— Зайдите в описание канала и нажмите кнопку Discuss / Чат
— Нажмите Join / Присоединиться
— Сразу обратите внимание на сообщение от бота Shieldy
— Решите простой пример и отправьте ответ в чат
После этого бот отправит приветственное сообщение и вы сможете оставлять комментарии. Эту проверку нужно пройти только один раз при вступлении в чат.
❗️ Если вас все-таки забанили
— Это временная блокировка на несколько минут
— Подождите и попробуйте зайти позже, бот снова отправит вам капчу
Админы канала никак не могут ускорить процесс, бот автоматически снимает с вас блокировку через пару минут. Мы понимаем, что эта система неидеальна, и ищем более удобное решение.
👾 Спасибо, что активно участвуете в обсуждении наших постов!
🎮💾 Оптимизация памяти в Unity: как избежать лагов и повысить FPS в играх
Оптимизация памяти в Unity — ключ к стабильной работе игр. Если хочется избежать лагов и повысить FPS, важно правильно управлять памятью. Использование эффективных методов загрузки и выгрузки данных, уменьшение количества аллокаций и грамотное применение сборщика мусора помогут улучшить производительность и стабильность игры.
➡️ Подробнее в статье
🐸Библиотека шарписта
🐧 Пингвин, покоривший мир: история взлета Linux – ОС, управляющей 96% серверов
В 1991 году на компьютере с 4 мегабайтами памяти родилась программа, которая сегодня управляет большей частью интернета, смартфонами и даже космическими аппаратами. Это история Linux, рассказанная одним из первых свидетелей.
➡️ Читать статью
➡️ Зеркало
Количество уникальных букв в строке
1. Создаем строку str, которую нужно проанализировать.
2. Применяем метод Distinct() для получения уникальных символов в строке.
3. Вызываем метод Count() для получения количества элементов в последовательности уникальных символов.
4. Добавляем параметр char.IsLetter, чтобы учитывать только буквы алфавита.
📰 Еженедельный дайджест
Что произошло за прошедшую неделю марта:
➖ 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 году — собрали для вас самые частые вопросы со структурами данных.
🐸Библиотека шарписта #свежак
Любите делать техдолг?
🐸Библиотека шарписта #развлекалово
⭐️ Новый выпуск .NET Rocks
C# 13 уже на горизонте! Какие изменения нас ждут, и стоит ли разработчикам опасаться очередного «революционного» обновления? В новом выпуске подкаста .NET Rocks! ведущий архитектор C#, раскрывает детали будущего языка.
🧐 О чем выпуск
• Будущее C# — какие новые возможности появятся в C# 13.
• Как Microsoft принимает решения о развитии языка.
• Как новые фичи повлияют на разработчиков.
Если вы работаете с .NET, этот выпуск точно стоит послушать.
➡️ Слушать подкаст
🐸Библиотека шарписта #буст
✅ Чек-лист: правильное использование 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 — это не просто удобство, а инструмент, требующий понимания его тонкостей.
🐸Библиотека шарписта #буст
⌨️ Создание alias для частых команд
Алиасы позволяют создать короткие команды для часто используемых действий.
Например, вместо длинного git log --oneline --graph --all --decorate, можно настроить удобный git lg, который покажет красивую и наглядную историю коммитов:
Вот как это сделать:
git config --global alias.lg "log --oneline --graph --all --decorate"
git lg покажет красивую историю коммитов.
Как избежать утечек памяти в .NET
Собрали для вас обязательные правила, с которыми утечки памяти будут исключены из ваших проектов.
1️⃣ Отписывайтесь от обработчиков событий
Если объект подписался на событие и не отписался, он останется в памяти.
✅ Решение: Используйте -=, чтобы отписаться от события:
eventHandler.SomeEvent -= MyEventHandler;
IDisposableclass MyClass : IDisposable {
public void Dispose() {
// Очистка ресурсов
}
}using, чтобы автоматически вызвать Dispose():using (var obj = new MyClass()) { /* работа с объектом */ }WeakReference<MyObject> weakRef = new WeakReference<MyObject>(new MyObject());
GC.Collect() .
✍🏻 Запишите названия всех этапов жизненного цикла страницы ASP.NET
— Запрос страницы
— Начало жизненного цикла страницы
— Инициализация страницы
— Загрузка страницы
— Проверка
— Обработка событий постбэка
— Рендеринг страницы
— Выгрузка
😧 58% IT-специалистов страдают: психология успеха и борьба с синдромом самозванца
Синдром самозванца — не просто модный термин, а реальная проблема, с которой сталкиваются даже опытные разработчики. Почему так происходит и как с этим бороться? Разбираемся в причинах «стандартной болезни айтишников»
➡️ Читайте в статье
Спойлер: дело не в навыках, а в психологии успеха
🐸Библиотека шарписта
🎉 Поздравляем с 8 марта
Сегодня отмечаем вклад девушек-разработчиков, аналитиков, тестировщиков, тимлидов и всех, кто влюблён в код. Без вас IT не было бы таким, каким мы его знаем. С праздником, коллеги 💐
Женщины оставили огромный след в истории IT. Если вам кажется, что программирование — это исключительно «мужская территория», взгляните, вот лишь несколько легендарных женщин:
🔹 Ада Лавлейс — автор первой компьютерной программы ещё в 19 веке.
🔹 Грейс Хоппер — создала первый компилятор и популяризировала термин «баг».
🔹 Барбара Лисков — её принцип Liskov Substitution является основой ООП, в том числе в Java.
🔹 Эдит Кларк — первая женщина-инженер, внесшая вклад в вычислительные методы в энергетике.
🔹 Маргарет Гамильтон — разработала софт для посадки «Аполлона-11» на Луну.
А это только малая часть. В статье собраны ещё больше вдохновляющих историй.
🔗 Подробнее в статье
🐸 Библиотека джависта
#️⃣🔄 Асинхронность в Unity: лучше или хуже, чем корутины?
Unity развивается, и старые добрые корутины постепенно уступают место асинхронным методам.
Мы привыкли к StartCoroutine(), но стоит ли переходить на Task? Разбираем плюсы и минусы каждого подхода.
📎 Читать статью
🐸Библиотека шарписта
🤔 Какую IDE выбрать
Сколько разработчиков – столько мнений. Одни держатся за Visual Studio, несмотря на её «вес» в 100 ГБ. Другие фанатеют от Rider, но не хотят платить. А кто-то вообще пишет C# в VS Code и не парится.
👉 Может, пора менять дефолтную IDE? Или старый добрый VS всё ещё впереди? Давайте разберёмся в комментариях
🐸Библиотека шарписта #междусобойчик