fa
Feedback
Библиотека шарписта | C#, F#, .NET, ASP.NET

Библиотека шарписта | C#, F#, .NET, ASP.NET

رفتن به کانال در Telegram

Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

نمایش بیشتر
2025 سال در اعدادsnowflakes fon
card fon
22 356
مشترکین
-1224 ساعت
-287 روز
-13730 روز
جذب مشترکین
دسامبر '25
دسامبر '25
+105
در 1 کانال‌ها
نوامبر '25
+133
در 1 کانال‌ها
Get PRO
اکتبر '25
+66
در 0 کانال‌ها
Get PRO
سپتامبر '25
+121
در 0 کانال‌ها
Get PRO
اوت '25
+106
در 1 کانال‌ها
Get PRO
ژوئیه '25
+126
در 0 کانال‌ها
Get PRO
ژوئن '25
+136
در 0 کانال‌ها
Get PRO
مه '25
+138
در 0 کانال‌ها
Get PRO
آوریل '25
+204
در 1 کانال‌ها
Get PRO
مارس '25
+307
در 2 کانال‌ها
Get PRO
فوریه '25
+304
در 2 کانال‌ها
Get PRO
ژانویه '25
+241
در 2 کانال‌ها
Get PRO
دسامبر '24
+251
در 2 کانال‌ها
Get PRO
نوامبر '24
+230
در 2 کانال‌ها
Get PRO
اکتبر '24
+223
در 2 کانال‌ها
Get PRO
سپتامبر '24
+198
در 2 کانال‌ها
Get PRO
اوت '24
+189
در 2 کانال‌ها
Get PRO
ژوئیه '24
+219
در 2 کانال‌ها
Get PRO
ژوئن '24
+176
در 2 کانال‌ها
Get PRO
مه '24
+458
در 2 کانال‌ها
Get PRO
آوریل '24
+497
در 7 کانال‌ها
Get PRO
مارس '24
+460
در 7 کانال‌ها
Get PRO
فوریه '24
+501
در 7 کانال‌ها
Get PRO
ژانویه '24
+641
در 6 کانال‌ها
Get PRO
دسامبر '23
+785
در 7 کانال‌ها
Get PRO
نوامبر '23
+415
در 2 کانال‌ها
Get PRO
اکتبر '23
+594
در 7 کانال‌ها
Get PRO
سپتامبر '23
+1 498
در 7 کانال‌ها
Get PRO
اوت '230
در 8 کانال‌ها
Get PRO
ژوئیه '230
در 2 کانال‌ها
Get PRO
ژوئن '23
+14
در 0 کانال‌ها
Get PRO
مه '23
+587
در 2 کانال‌ها
Get PRO
آوریل '23
+759
در 0 کانال‌ها
Get PRO
مارس '23
+43
در 0 کانال‌ها
Get PRO
فوریه '23
+1 106
در 0 کانال‌ها
Get PRO
ژانویه '230
در 0 کانال‌ها
Get PRO
دسامبر '220
در 0 کانال‌ها
Get PRO
نوامبر '220
در 0 کانال‌ها
Get PRO
اکتبر '22
+102
در 0 کانال‌ها
Get PRO
سپتامبر '22
+394
در 0 کانال‌ها
Get PRO
اوت '22
+503
در 0 کانال‌ها
Get PRO
ژوئیه '22
+525
در 0 کانال‌ها
Get PRO
ژوئن '22
+581
در 0 کانال‌ها
Get PRO
مه '22
+289
در 0 کانال‌ها
Get PRO
آوریل '22
+339
در 0 کانال‌ها
Get PRO
مارس '22
+455
در 0 کانال‌ها
Get PRO
فوریه '22
+241
در 0 کانال‌ها
Get PRO
ژانویه '22
+14 559
در 0 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
26 دسامبر+1
25 دسامبر+1
24 دسامبر+4
23 دسامبر+1
22 دسامبر+1
21 دسامبر+5
20 دسامبر+5
19 دسامبر+3
18 دسامبر+3
17 دسامبر+7
16 دسامبر+2
15 دسامبر+2
14 دسامبر+2
13 دسامبر+3
12 دسامبر+8
11 دسامبر+7
10 دسامبر+6
09 دسامبر+9
08 دسامبر+5
07 دسامبر0
06 دسامبر+4
05 دسامبر+10
04 دسامبر0
03 دسامبر+8
02 دسامبر+4
01 دسامبر+4
پست‌های کانال
🔗 Цепочка конструкторов в C# Конструкторы вызываются при создании объекта. В C# можно связывать их в цепочку: один конструктор вызывает другой. Это убирает дублирование кода инициализации.​ Представьте класс User с тремя конструкторами:
public class User
{
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
    public DateTime Created { get; set; }

    // Базовая инициализация
    public User()
    {
        Created = DateTime.Now;
        Name = "Гость";
        Email = "guest@example.com";
    }

    public User(string name) 
    {
        Created = DateTime.Now;  // Дублируем!
        Name = name;
        Email = "guest@example.com";
    }

    public User(string name, string email)
    {
        Created = DateTime.Now;  // Снова дублируем!
        Name = name;
        Email = email;
    }
}
Проблема: Created и дефолтные значения повторяются. Изменить в одном месте нельзя. Как работает цепочка с this() Используйте : this(параметры):
public class User
{
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
    public DateTime Created { get; set; }

    // Главный конструктор - вся логика здесь
    public User(string name, string email, int age = 0)
    {
        Created = DateTime.Now;
        Name = name ?? "Гость";
        Email = email ?? "guest@example.com";
        Age = age;
    }

    // Цепочка к главному
    public User() : this("Гость", "guest@example.com") { }

    public User(string name) : this(name, "guest@example.com") { }

    public User(string name, string email) : this(name, email, 0) { }
}
Тестируем:
var user1 = new User();                    // Гость, guest, 0
var user2 = new User("Иван");             // Иван, guest, 0  
var user3 = new User("Иван", "i@example"); // Иван, i@example, 0
var user4 = new User("Анна", "a@ex", 25); // Анна, a@ex, 25
Все получают Created = Now автоматически Правила цепочки: • Должна быть первой в конструкторе:
public User(string name) : this(name, "default")  // OK
{
    // Дополнительная логика
}
• Нельзя дважды:
public User() : this("a") : base()  // Ошибка!
Идеально для классов с множеством опциональных параметров. Главное: короткие цепочки и главный конструктор с полной логикой. 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

90560

2
😑 Что выведет код Делегаты в шарпах — штука базовая, но в деталях легко запутаться. Посмотрите на код и предскажите вывод, п
😑 Что выведет код Делегаты в шарпах — штука базовая, но в деталях легко запутаться. Посмотрите на код и предскажите вывод, прежде чем проверять. ➡️ Для любознательных ответ в нашем канале с задачами 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #dotnet_challenge
1 760
3
⏳ Интерполяция строк не бесплатна Строки в горячих участках вашего кода бьют по памяти сильнее чем кажется. В ASP.NET они часто оказываются в топе аллокаторов в профайлере. Что создаёт лишние строки • Интерполяция var key = $"{userId}:{tenantId. Каждый вызов порождает новый string и новый массив char. • string.Format string.Format("{0}-{1}", a, b); работает по той же схеме создаёт новый объект и буфер под символы. • Частые ToString() request.Headers["X-Id"].ToString(); при каждом запросе снова строит строку из заголовка. Как сделать безопаснее • Использовать структурированное логирование logger.LogInformation("User {UserId} logged in", userId); В этом случае ILogger не формирует строку когда соответствующий уровень логов отключён, а значения попадают в структурированные поля записи. • Не вызывать ToString() без необходимости Формируйте строку только там где она действительно нужна в ответе или в редком логировании, а не в общем горячем пути. • В особо чувствительных местах использовать Span и ValueStringBuilder Они позволяют собирать текст в переиспользуемом буфере и заметно снизить количество мусора. Если код выполняется на каждом запросе, строковая интерполяция и лишние преобразования в string перестают быть дешёвым сахаром и становятся реальным источником аллокаций. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #il_люминатор
2 252
4
🛠 ToonEncoder для .NET ToonEncoder — это библиотека, которая кодирует данные в TOON. TOON описывается как компактное человек
🛠 ToonEncoder для .NET ToonEncoder — это библиотека, которая кодирует данные в TOON. TOON описывается как компактное человекочитаемое представление той же модели данных что и JSON, но с упором на экономию токенов в промптах для LLM. Практический кейс для айтишников это подготовка данных для LLM, например список логов, результатов поиска, объектов из базы, или пачка тул коллов, где табличный вид дает меньше лишней пунктуации и меньше повторяющихся ключей. Пример: using Cysharp.AI; var users = new User[] { new (1, "Alice", "admin"), new (2, "Bob", "user"), }; string toon = ToonEncoder.Encode(users); Console.WriteLine(toon); string toon2 = ToonEncoder.EncodeAsTabularArray(users); Console.WriteLine(toon2); Console.WriteLine(toon == toon2); // same result public record User(int Id, string Name, string Role); У TOON есть режимы с разными разделителями, включая таб и пайп, чтобы еще чуть подкрутить токенизацию под конкретный ввод. ➡️ Репозиторий 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view
2 340
5
WANTED: .NET-РЕЦЕДИВИСТ Разыскивается эксперт, способный приручить C# и заставить его работать идеально. Мы знаем, что у тебя
WANTED: .NET-РЕЦЕДИВИСТ Разыскивается эксперт, способный приручить C# и заставить его работать идеально. Мы знаем, что у тебя есть секретные приёмы, которыми пора поделиться с комьюнити. Приметы: — глубоко знает экосистему .NET и может сравнить её с Java или Go; — умеет проектировать сложные системы без «костылей»; — готов выступать на большую аудиторию в качестве автора или ментора; — хочет монетизировать свой профессиональный опыт. Что в контракте: — гонорар за интеллектуальный вклад; — статус официального эксперта Proglib Academy; — заметный буст личного бренда. Признаться во всём здесь P.S. Знаешь сильного «шарписта»? Сдай его следствию — перешли пост.
2 387
6
⚙️ Yield в упрощает итерацию Yield позволяет создавать итераторы, возвращая элементы коллекции по одному, без загрузки всего в память сразу. Как работает yield return При yield return код возвращает значение и сохраняет состояние для следующей итерации в foreach или LINQ. Компилятор генерирует класс, реализующий IEnumerable<T>, с MoveNext() для продолжения. Пример простого генератора четных чисел: IEnumerable<int> EvenNumbers(int max) { for (int i = 0; i <= max; i += 2) { yield return i; } } foreach по нему выдаст 0, 2, 4... лениво, только при запросе. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view
2 544
7
⚙️ Yield в упрощает итерацию Yield позволяет создавать итераторы, возвращая элементы коллекции по одному, без загрузки всего в память сразу. Метод с yield превращается в state machine, которая приостанавливает выполнение до следующего вызова. Как работает yield return При yield return код возвращает значение и сохраняет состояние для следующей итерации в foreach или LINQ. Компилятор генерирует класс, реализующий IEnumerable<T>, с MoveNext() для продолжения.
1
8
😊 Потоковый ответ вместо буферизации Во многих API до сих пор пишут методы вида public IEnumerable GetOrders() и д
😊 Потоковый ответ вместо буферизации Во многих API до сих пор пишут методы вида public IEnumerable<OrderDto> GetOrders() и думают что это ленивый возврат данных. На деле фреймворк вынужден сначала полностью пройти по IEnumerable, собрать коллекцию, а уже потом целиком сериализовать ее в JSON и отправить в сеть. Большой список целиком оказывается в куче, всплеск аллокаций ускоряет сборку мусора, а клиент ждет первый байт до тех пор пока не будет готов весь массив данных. В современных версиях .NET намного безопаснее отдавать последовательность как IAsyncEnumerable<T>. В этом случае ASP.NET может сериализовать элементы по мере их появления и выводить их в ответ потоком вместо полной буферизации результата. Альтернативный вариант — явно использовать Results.Stream и JsonSerializer.SerializeAsync(stream, data) чтобы отдать JSON как поток байтов и держать в памяти лишь небольшой кусок данных. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #il_люминатор
2 526
9
🎅 Секретный Санта для айтишников от Proglib.academy Весь этот год команда Академии запускала курсы для айтишников. А под Нов
🎅 Секретный Санта для айтишников от Proglib.academy Весь этот год команда Академии запускала курсы для айтишников. А под Новый год мы запускаем новый курс по ИИ-агентам и ставим под ёлку самый свежий стек 2025 года и обучение проектированию автономных нейросетевых экосистем — от LLM и ReAct-циклов до мультиагентных систем, LangGraph, AutoGen и продакшн-практик. 🎁 Хотим дарить подарки и приглашаем вас поучаствовать в конкурсе: 1️⃣ Упомяните курс Академии у себя в блоге. 2️⃣ Пришлите скрин сюда. 3️⃣ Получите секретный промокод на 10 000 ₽ при оплате любого курса. Подходит всё — соцсети, блоги, Telegram-каналы от 300 подписчиков и более. 🎄 Акция действует до Нового года. Win-win, всё как мы любим!
2 472
10
🥹🥹 Можно заказать на амазоне 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #garbage_collector
🥹🥹 Можно заказать на амазоне 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #garbage_collector
2 591
11
🎚 Подборка вакансий для шарпистов Backend-разработчик C# на удалёнку. .NET Developer (Middle) — удалёнка или офис в СПб. Senior Backend-разработчик — от 365 000 ₽ ➡️ Еще больше топовых вакансий — в нашем канале C# Jobs 🐸 Библиотека шарписта
2 737
12
⚙️ Поиск дубликатов с LINQ Когда коллекция растет, руками гонять двойные циклы для поиска дубликатов уже не хочется. В .NET это хорошо решается комбинацией LINQ и HashSet, плюс классическими GroupBy и Distinct. LINQ Any и HashSet Идея простая: HashSet хранит только уникальные элементы. Метод Add возвращает false если такое значение уже было. Значит можно пробежать коллекцию через Any и остановиться на первом дубликате: public static bool HasDuplicatesAny<T>(IEnumerable<T> source) { HashSet<T> seen = new(); return source.Any(item => !seen.Add(item)); } Метод возвращает true как только встретится элемент который не удалось добавить в набор. LINQ GroupBy и Count 1 Если нужны сами дубликаты, а не только факт их наличия, помогает GroupBy. Мы группируем по значению и фильтруем группы в которых больше одного элемента: public static IEnumerable<T> GetDuplicatesGroupBy<T>(IEnumerable<T> source) { return source .GroupBy(x => x) .Where(g => g.Count() > 1) .Select(g => g.Key); } LINQ Distinct и подсчет элементов Иногда достаточно проверить есть ли дубликаты, не вытаскивая их. Тогда можно сравнить размер исходной коллекции и количества уникальных элементов после Distinct: public static bool HasDuplicatesDistinct<T>(IEnumerable<T> source) { int total = source.Count(); int unique = source.Distinct().Count(); return unique != total; } Для быстрых проверок чаще всего хватает Any + HashSet. GroupBy удобно когда нужны сами дубликаты. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view
2 735
13
🛠 RoomSharp 0.4.3: миграции для продакшена RoomSharp смешивает декларативные [AutoMigration] и императивные классы миграций.
🛠 RoomSharp 0.4.3: миграции для продакшена RoomSharp смешивает декларативные [AutoMigration] и императивные классы миграций. Автоматически обрабатывает переименования таблиц, колонок, добавление/удаление полей. MigrationManager следит за версиями в __room_metadata, предупреждает о деструктивных изменениях и запускает колбэки. Установка — dotnet add package RoomSharp плюс провайдеры вроде RoomSharp.SqlServer. Расширения RoomSharp.Extensions для конфига. 📎 В блоге разработчиков много полезной информации 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #async_news
2 797
14
AI-агенты в продакшн: промышленный стандарт архитектуры В Enterprise-разработке на первый план выходит контроль и предсказуем
AI-агенты в продакшн: промышленный стандарт архитектуры В Enterprise-разработке на первый план выходит контроль и предсказуемость. Мы учим проектировать ИИ-агентов как надёжные системы со строгой логикой и мониторингом. Ключевые модули: — управление состоянием в LangGraph для проектирования сложных стейт-машин; — архитектура `RAG` на базе Pinecone или Chroma для обоснованной генерации ответов; — промышленная автоматизация через n8n для интеграции логики в бизнес-процессы; — безопасность и observability с внедрением LangSmith и Guardrails для аудита системы. Результат — масштабируемая система, готовая к интеграции в ваш стек. Подробности курса
2 651
15
🗂 Работа и пет-проекты с одного ПК Работаете днём в корпоративном репо, вечером в личном на GitHub. Один ПК, но email и ключ
🗂 Работа и пет-проекты с одного ПК Работаете днём в корпоративном репо, вечером в личном на GitHub. Один ПК, но email и ключи подписи разные. Ручная смена настроек Git каждый раз бесит и приводит к косякам с коммитами. Условные includeIf решают всё Добавьте в ~/.gitconfig пару строк. Git сам подхватит нужный конфиг по пути к папке или remote URL. Для рабочих папок загрузит корпоративный email: [includeIf "gitdir:~/work/"] path = .gitconfig-corp Личные репозитории получат ваш домашний email автоматически: [includeIf "hasconfig:remote..url:https://github.com/вашеимя/"] path = .gitconfig-personal Забудьте про git config --global user.email каждый раз. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view
2 975
16
🤨 Lazy<T> против всех синглтонов Lazy<T> в C# стал де-факто стандартом для thread-safe ленивой инициализации. Забудьте lock, volatile и двойные проверки. Проблемы классического синглтона: public sealed class ClassicSingleton { private static ClassicSingleton _instance; private static readonly object _lock = new object(); private ClassicSingleton() { // 2 секунды на реальную БД/файлы Thread.Sleep(2000); Console.WriteLine("ClassicSingleton создан"); } public static ClassicSingleton Instance { get { if (_instance == null) { lock (_lock) { _instance ??= new ClassicSingleton(); } } return _instance; } } } Lazy<T> решает всё элегантно: public sealed class LazySingleton { private static readonly Lazy<LazySingleton> _lazy = new Lazy<LazySingleton>(() => { Console.WriteLine("LazySingleton создан (ТОЛЬКО РАЗ)"); Thread.Sleep(2000); // Имитация тяжёлой работы return new LazySingleton(); }); private LazySingleton() { } public static LazySingleton Instance => _lazy.Value; public static bool IsInitialized => _lazy.IsValueCreated; } Реальный многопоточный тест: static async Task TestPerformance() { var stopwatch = Stopwatch.StartNew(); var tasks = Enumerable.Range(0, 1000) .Select(i => Task.Run(() => { var instance = LazySingleton.Instance; return instance.GetHashCode(); })) .ToArray(); var results = await Task.WhenAll(tasks); stopwatch.Stop(); Console.WriteLine($"1000 потоков: {stopwatch.ElapsedMilliseconds}ms"); Console.WriteLine($"Уникальных объектов: {results.Distinct().Count()}"); Console.WriteLine($"Инициализировано: {LazySingleton.IsInitialized}"); } Lazy<T> — это не хак, а официальный стандарт Microsoft. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #il_люминатор
3 162
17
🧠 When и Unless для умных проверок В FluentValidation условная валидация запускает правила только при нужных условиях. When и Unless экономят циклы и делают валидаторы читаемыми. • When = «проверить, если условие верно» • Unless = «проверить, если условие НЕ верно» Пример: RuleFor(x => x.ShippingAddress) .NotEmpty() .When(x => x.DeliveryMethod == "Express"); RuleFor(x => x.CreditCard) .NotEmpty() .Unless(x => x.PaymentMethod == "PayPal"); When проверяет условие перед правилом. Express доставка требует адрес, PayPal не требует карту. Логика в одном месте без if-else в контроллере. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view
3 502
18
💃 Пред-предновогодний дайджест Вспомним что происходило на этой неделе. — GetElapsedTime сам посчитает время выполнения — Пи
💃 Пред-предновогодний дайджест Вспомним что происходило на этой неделе. — GetElapsedTime сам посчитает время выполнения — Пишем письмо Деду Морозу — Пагинация и фильтрация через красоту — Сотрудника Amazon уволили из-за пинга Почитать: — Подборка ИИ-инструментов для поиска работы за рубежом 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #async_news
3 399
19
AI-агенты в Enterprise: взгляд .NET разработчика Пока стартапы играются с Python-скриптами, энтерпрайз требует архитектуры. М
AI-агенты в Enterprise: взгляд .NET разработчика Пока стартапы играются с Python-скриптами, энтерпрайз требует архитектуры. Мультиагентные системы в 2026 году — это, по сути, новые микросервисы. В обновленном курсе по AI-агентам мы сместили фокус с простого «кодинга» на системное проектирование и архитектуру. Что важного для архитектора: — Оркестрация: Разбор LangGraph (графы состояний) и AutoGen. — RAG & Vector DBs: Интеграция с Pinecone/Weaviate (актуально для корпоративных баз знаний). — Инфраструктура: Deployment, GPU-кластеры и AgentOps (мониторинг). — Курс разделен на треки. Если не хотите писать на Python, выбирайте Overview — поймете принципы построения систем, протоколы MCP и A2A коммуникацию. ⚡️ Offer 3-in-1: Покупаете курс по агентам — забираете два любых других бесплатно. Отличный шанс взять «Алгоритмы» или «Паттерны». Изучить программу
3 441
20
💃 Волшебство для больших проектов Partial классы — это C#-хакинг, который разбивает один класс на несколько файлов, не ломая компиляцию. Идеально для автогенерации, командной работы и масштабирования монстров-кода. Представьте: WinForms или WPF дизайнер генерирует кучу кода в .Designer.cs, а вы хотите добавить свою логику. Без partial пришлось бы вручную мержить изменения или наследоваться с кучей override. Partial решает это элегантно — основной класс в вашем файле, автокод в отдельном. Все части класса должны иметь одинаковые модификаторы доступа и использовать ключевое слово partial. Компилятор проверит согласованность. Живой пример: // Employee.Core.cs — базовая структура public partial class Employee { public string Name { get; set; } public decimal Salary { get; set; } public partial void ValidateName(); public partial void ValidateSalary(); public void Hire() { ValidateName(); ValidateSalary(); Console.WriteLine($"{Name} нанят с зарплатой {Salary:C}!"); } } // Employee.Validation.cs — бизнес-правила public partial class Employee { public partial void ValidateName() { if (string.IsNullOrWhiteSpace(Name) || Name.Length < 2) throw new ArgumentException("Имя должно быть не короче 2 символов!"); } public partial void ValidateSalary() { if (Salary < 50000) throw new ArgumentException("Зарплата не может быть ниже 50k!"); } } // Employee.Extensions.cs — расширения (опционально) public partial class Employee { public void Promote() => Salary *= 1.2m; } Partial методы уникальны: если реализация отсутствует, метод полностью удаляется из IL. Идеально для опциональных хуков в генерируемом коде. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view
2 929