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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
⏱️ Как ускорить асинхронный код в C#

Частая ошибка — писать асинхронные вызовы последовательно:
await GetUser();
await GetOrders();
await GetRecommendations();


Каждая операция ждёт предыдущую и если каждый запрос занимает по секунде, общее время = 3 секунды.

А можно иначе:
var userTask = GetUser();
var ordersTask = GetOrders();
var recsTask = GetRecommendations();

await Task.WhenAll(userTask, ordersTask, recsTask);


Все задачи стартуют сразу. Теперь общее время = 1 секунда (ожидание самой длинной операции).

Маленький приём — большая разница во времени выполнения.

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35🥱811
🔄 Апдейт .NET Aspire

Microsoft представила .NET Aspire 9.5 — свежий релиз для разработки распределённых приложений. Главное новшество — file-based AppHost: теперь можно описать всё приложение в одном файле apphost.cs, без громоздких .csproj. Добавление ресурсов и сервисов делается буквально одной строкой.

Ещё появились улучшения в CLI, новая команда aspire update, упрощающая апгрейд SDK и интеграций, а также обновлённый дэшборд.

➡️ Блог разработчиков

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

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8🌚1
🤫 Курс «ИИ-агенты для DS-специалистов»

Каждый технологический скачок оставляет позади тех, кто «подождал ещё чуть-чуть». ИИ-агенты — это новый рывок.

Уже через пару лет именно они будут драйвить аналитику и автоматизацию. Хотите остаться на гребне?

🖥️ На курсе «ИИ-агенты для DS-специалистов» мы разберём:

— создание AI-агентов с нуля
— сборку собственной RAG-системы
— интеграцию LLM под задачи бизнеса

📌 Курс подходит:

→ ML/AI инженерам (middle+ / senior)
→ Data Scientists
→ Backend и platform-инженерам
→ Advanced CS/DS студентам

⚡️ Старт уже скоро — 3 октября.

💰 До 28 сентября действует скидка — 57.000 ₽ вместо 69.000 ₽ (по промокоду datarascals).

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

З.ы. если вы не успели на вебинар «ИИ-агенты: новая фаза развития искусственного интеллекта» — запись уже доступна
🥱1
Что выведет код

Пишите свои ответы в комментариях 👇

Для любознательных ответ такой: 333

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

#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Каналы в .NET

Когда в приложении нужно обрабатывать поток данных от продюсеров к потребителям, первым делом вспоминают про очереди или ConcurrentQueue. Но в асинхронном мире этого мало. Поэтому в .NET есть каналы.

Канал устроен как пара из продюсера и потребителя. Когда продюсер пишет элемент в канал, он либо сразу уходит к потребителю, либо ждёт, если очередь переполнена. Потребитель, в свою очередь, может ждать новые элементы без блокировки потоков — всё работает на async/await.

Главная сила каналов — балансировка нагрузки.

Ограниченные каналы позволяют держать под контролем количество элементов. Это защищает приложение от перегрузки: если продюсер работает быстрее, чем потребитель, система сама притормозит поток данных.

Неограниченные каналы — вариант попроще, они всегда принимают новые элементы, но это может обернуться непредсказуемым ростом памяти.

Мини-пример:
var channel = Channel.CreateBounded<int>(5);

// producer
_ = Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
await channel.Writer.WriteAsync(i);
Console.WriteLine($"Produced {i}");
}
channel.Writer.Complete();
});

// consumer
await foreach (var item in channel.Reader.ReadAllAsync())
{
Console.WriteLine($"Consumed {item}");
}


Почему это лучше, чем ConcurrentQueue? Потому что Channel создан сразу с учётом асинхронности. Вам не нужно городить блокировки и таймеры ожидания — достаточно написать await reader.ReadAsync(), и код будет сам по себе масштабироваться без блокировки потоков.

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
23👍8🤩4
🔥 Сегодня последний день скидки!

На недавнем вебинаре «ИИ-агенты: новая фаза развития AI» мы показали, как агенты уже меняют работу Data Scientists и инженеров.

Что тебя ждёт на курсе:

⚡️ создашь своего ИИ-агента с нуля
⚡️ соберёшь RAG-систему
⚡️ научишься адаптировать LLM под реальные данные бизнеса

До конца этого дня цена на курс 57 000 ₽. Уже завтра будет 69 000 ₽. Успевай записаться (используй промокод datarascals).

🔗 Записаться на курс
🥰4🥱2👍1
😘 Дайджест недели

Собрали для вас новости и материалы последней недели.

WinUI Gallery 2.7

Вышла новая версия WinUI Gallery — приложения для изучения и тестирования контролов WinUI. В версии 2.7 появились вкладки истории и избранного. Добавлены новые и обновлённые сэмплы: от TitleBar до ThemeShadow.

Google Play переходит на 16 KB

.NET MAUI 9 уже совместим с новым требованием Google. Достаточно обновиться до .NET 9, проверить пакеты в проекте и заменить те, что не поддерживают новые страницы.

XAML Live Preview

Где заказать курсовую по программированию

Библиотека для величин — UnitsNet

.NET Aspire 9.5

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

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
Последние часы со скидкой!

Мы уже закрыли вебинар «ИИ-агенты: новая фаза развития AI», но запись всё ещё доступна.

А дальше остаётся только практика. На курсе «ИИ-агенты для DS-специалистов» ты научишься разрабатывать агентов, собирать RAG-системы и адаптировать LLM под бизнес.

Сегодня цена ещё 57.000 ₽ с промокодом datarascals.
Завтра — 69.000 ₽.

👉 Успеть оплатить до полуночи
🥱2
🤟 Шарповый взгляд

Привет, шарписты! Как вам контент на этой неделе?

Отзыв и предложения принимаются в комментах 👇

🐸 Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🥱2
🚩 Задача с собеса: пират и сундуки

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

Как решить эту задачу:

1. Делим сундуки на группы по 6 штук. Взвешиваем. Берём ту группу, где вес меньше.

2. Снова делим на группы, но теперь по 3. Взвешиваем. Берём ту тройку, где легче.

3. Сравниваем внутри этой тройки два сундука. Лёгкий сундук и будет с песком. Если сундуки одинаковые по весу, но с песком тот, что остался.

Задача решается бинарным поиском.

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

#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20👏32😁1
🤩 Придумали ещё задачку

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

Твиттер или Х?

Как бы вы ответили? К слову, подписывайтесь на наши каналы в обоих соц. сетях. Там мемы и полезные материалы.

🐸 Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚5
📀 Record-типы в C#

record в C# — это удобный способ описывать объекты данных без лишнего кода. Они сравниваются по значению, остаются неизменяемыми и отлично подходят для DTO или моделей в DDD.

Если раньше приходилось писать десятки строк с Equals, GetHashCode, ToString и конструкторами, то теперь всё это даёт одна строчка:
public record User(string Name, int Age);


Отличие от классов

Class сравнивается по ссылке. Два объекта с одинаковыми данными — разные сущности.

Record сравнивается по значению. Два объекта с одинаковыми полями — эквивалентны.

var u1 = new User("Alice", 25);
var u2 = new User("Alice", 25);

Console.WriteLine(u1 == u2); // true


Дополнительные фишки

Записи неизменяемы, но их удобно клонировать с изменением:
var u1 = new User("Alice", 25);
var u2 = u1 with { Age = 26 };

Console.WriteLine(u2); // User { Name = Alice, Age = 26 }


Можно наследовать record-тип:
public record User(string Name, int Age);
public record Admin(string Name, int Age, string Role) : User(Name, Age);

record — это синтаксический сахар, который сокращает код и делает модели данных чище и понятнее.

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

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍191
🤖 Курс «ИИ-агенты для DS-специалистов»

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

📚 Бонус: при оплате до 30 сентября вы получите дополнительный лонгрид для подготовки к курсу. Это отличный способ подойти к занятиям уже с базой.

🔥 А ещё после прохождения курса у вас будет достаточно знаний, чтобы участвовать в хакатоне с призовым фондом 1 125 000 ₽.

🔗 Записаться на курс и узнать подробности
🥱5
⚡️ Nullable vs null-check

работа с null всегда была источником ошибок. Каждый хоть раз ловил NullReferenceException в рантайме.
Есть два подхода: старый — вручную проверять null, и новый — использовать nullable reference types с поддержкой компилятора.

Код с ручной проверкой на null:
public string GetUserName(User? user)
{
if (user == null)
return "Anonymous";

return user.Name;
}


Плюсы:

• просто и понятно
• работает везде

Минусы:

• легко забыть проверить
• ошибки проявятся только в рантайме

С включённой фичей #nullable enable компилятор начинает помогать:
public string GetUserName(User? user)
{
return user?.Name ?? "Anonymous";
}


User? явно говорит: объект может быть null
• компилятор подсветит, если забыли проверить
• меньше бойлерплейта, больше читаемости

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤‍🔥5🥱53
🐘 PostgreSQL 18 — быстрее, умнее, надёжнее

Вышла новая версия PostgreSQL 18. Главное новшество — асинхронный ввод-вывод. Также ускорили апгрейды: теперь статистика оптимизатора сохраняется между версиями, и база работает быстрее сразу после обновления.

Для разработчиков добавили виртуальные вычисляемые колонки, генерацию UUIDv7 для оптимальной индексации и поддержку SSO через OAuth 2.0. В текстовых операциях появился быстрый PG_UNICODE_FAST для Unicode-сравнений и новые возможности для полнотекстового поиска.

➡️ Анонс обновления

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

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
🤖 Курс «ИИ-агенты для DS-специалистов»

Последняя возможность в этом году освоить ИИ-агентов с Proglib— старт живых вебинаров на курсе уже 3 октября!

Уже 24 студента изучают 5 лонгридов подготовительного модуля, чтобы сформировать базу к старту живых вебинаров с Никитой Зелинским.

📚 Бонус: при оплате до 30 сентября вы получите дополнительный лонгрид для подготовки к курсу. Это отличный способ подойти к занятиям уже с базой.

🔥 А ещё после прохождения курса у вас будет достаточно знаний, чтобы участвовать в хакатоне с призовым фондом 1 125 000 ₽.

🔗 Записаться на курс и узнать подробности
11🥱1
🔥 Избавляемся от if-else деревьев

Когда логика программы разрастается, мы часто пишем целые деревья if-else или switch. Но такой код тяжело читать и сопровождать.

Вместо if-ветвей можно использовать паттерн State. Он выносит каждое состояние в отдельный класс. Объект делегирует своё поведение текущему состоянию, а переходы происходят прозрачно.

Код с if'ами:
public class Document
{
public string State { get; set; } = "Draft";

public void Publish()
{
if (State == "Draft") State = "Moderation";
else if (State == "Moderation") State = "Published";
else Console.WriteLine("Документ уже опубликован");
}
}


Код со State:
public interface IDocumentState
{
void Publish(Document doc);
}

public class Draft : IDocumentState
{
public void Publish(Document doc) => doc.State = new Moderation();
}

public class Moderation : IDocumentState
{
public void Publish(Document doc) => doc.State = new Published();
}

public class Published : IDocumentState
{
public void Publish(Document doc) => Console.WriteLine("Уже опубликован");
}

public class Document
{
public IDocumentState State { get; set; } = new Draft();
public void Publish() => State.Publish(this);
}


Теперь добавление нового состояния — просто новый класс, без переписывания всей логики.

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍135😁3😢3
⚡️ Быстрый in-memory кеш для .NET

BitFaster.Caching — это библиотека для in-memory кеша с акцентом на работу в многопоточной среде.

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

Что умеет:

• Потокобезопасные кеши без глобальных блокировок.

• Поддержка LRU и LFU (включая TinyLFU) для выбора стратегии вытеснения.

• Атомарное вычисление значений, чтобы избежать шторма запросов.

• Настраиваемые политики истечения: по времени доступа или записи.

• API-билдер для конфигурации размера и параметров кеша.

Пример:
var cache = CacheBuilder
.NewLru<string, MyObject>()
.WithCapacity(1000)
.ExpireAfterAccess(TimeSpan.FromMinutes(5))
.Build();

var value = cache.GetOrAdd("key", k => new MyObject(k));


➡️ Попробовать либу

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
1🤩5🔥3👍21