Latest posts

Библиотека шарписта | C#, F#, .NET, ASP.NET
23 Sept, 12:01
⚙️ yield return не бесплатныйИтераторы выглядят просто, но работают иначе:IEnumerable<int> GetIds() { foreach (var item in _items) yield return item.Id; }Читается как обычный цикл. Но компилятор превращает такой метод в конечный автомат со вспомогательными классами и состоянием. Именно поэтому итераторы такие выразительные — но и именно поэтому они не бесплатны.❓ Где это становится проблемойНа большинстве путей yield return это правильный выбор. Код чище, API удобнее, читаемость выше.Но на горячих путях, где метод вызывается тысячи раз в секунду, повторное создание объектов итератора и дополнительные слои абстракции начинают влиять на производительность. Не катастрофически, но измеримо.❓ Что делать на критичных участкахЕсли профилировщик показал, что итератор узкое место, есть несколько альтернатив.🟡 Заполнение буфера, переданного вызывающей стороной:void FillIds(Span<int> buffer) { for (int i = 0; i < _items.Count; i++) buffer[i] = _items[i].Id; }🟡 Возврат конкретной коллекции:List<int> GetIds() { var result = new List<int>(_items.Count); foreach (var item in _items) result.Add(item.Id); return result; }
Библиотека шарписта | C#, F#, .NET, ASP.NET
22 Sept, 06:47
💡 Replace, Regex или StringBuilder?Для замены текста в C# есть несколько инструментов. И выбирать их лучше не по принципу «что быстрее», а по задаче.🔜 string.Replace() — когда ищем конкретный текст:var result = text.Replace("cat", "dog");🔜 Regex.Replace() — когда нужен шаблон:var result = Regex.Replace( text, @"\d+", "#");Например, заменить все числа на #.🔜 StringBuilder.Replace() — когда последовательно изменяем большой текст:var sb = new StringBuilder(text);
Библиотека шарписта | C#, F#, .NET, ASP.NET
21 Sept, 13:05
⚙️ Настоящие атомарные операцииЕсли Volatile решает проблему видимости, то Interlocked решает проблему атомарности. Операции реализованы на уровне процессора и выполняются как неделимые единицы — никакой другой поток не может вмешаться в середину➡️ Самый частый сценарий это счётчик, который обновляют несколько потоков:private int _counter;public void Increment() { Interlocked.Increment(ref _counter); }Без Interlocked операция _counter++ на самом деле три шага: прочитать, прибавить, записать. Два потока могут выполнить их одновременно и затереть результат друг друга. Interlocked.Increment делает всё это за один неделимый шаг.➡️ Lock-free генератор IDInterlocked подходит для генерации уникальных идентификаторов без блокировок:public int GetNextId()
Библиотека шарписта | C#, F#, .NET, ASP.NET
20 Sept, 11:02
💪 Разминка перед трудовыми буднямиЧто произойдёт?❤️ — список станет [1, 3] 🔥 — InvalidOperationException 👍 — цикл пропустит 2Ответ спрячем здесь:🔥 InvalidOperationExceptionforeach использует List<T>.Enumerator. После Remove() коллекция изменяется, перечислитель обнаруживает изменение при следующем MoveNext() и выбрасывает исключение.📍 Навигация: Вакансии • Задачи • Собесы🐸Библиотека шарписта#dotnet_challenge


Библиотека шарписта | C#, F#, .NET, ASP.NET
19 Sept, 10:31edited
🧩 Middleware в ASP.NET Core: 3 ловушкиMiddleware — звено HTTP pipeline:app.Use(async (context, next) => { Console.WriteLine("Request");await next(context);Console.WriteLine("Response"); });1️⃣ Забыл next() — остановил pipelineawait _next(context);Если его не вызвать, middleware ниже и endpoint не выполнятся.2️⃣ Scoped-сервис не стоит инжектить в конструктор
Библиотека шарписта | C#, F#, .NET, ASP.NET
18 Sept, 12:01
📍 Навигация: Вакансии • Задачи • Собесы🐸Библиотека шарписта#garbage_collector


Библиотека шарписта | C#, F#, .NET, ASP.NET
17 Sept, 14:01
🦆 Duck typing в C# — почти как в TypeScriptВ TypeScript достаточно, чтобы у объекта был нужный метод:function foo(a: { Do(): void }) { a.Do(); }🔜 В C# так напрямую нельзя:class A { public void Do() => Console.WriteLine("A.Do"); }class B { public void Do() => Console.WriteLine("B.Do"); }


Библиотека шарписта | C#, F#, .NET, ASP.NET
17 Sept, 06:31
🧠 Почему .NET-под съедает всю память?kubectl top pod показывает 1 ГБ, а managed heap занимает всего 300 МБ. Куда делись остальные 700?Память .NET-процесса — это не только GC:— managed heap; — JIT и загруженные сборки; — стеки потоков; — native-библиотеки; — буферы сокетов; — runtime и TLS.Поэтому одного GCHeapHardLimitPercent недостаточно: он ограничивает только managed heap.🔴 Что проверить:kubectl top pod dotnet-counters monitor -p <pid> System.Runtime dotnet-gcdump collect -p <pid>


Библиотека шарписта | C#, F#, .NET, ASP.NET
15 Sept, 09:10
🧑💻 Забытый await: от race condition до DoS-атакиВ C# ключевое слово async — это инструкция компилятору превратить метод в state machine. await отмечает точку логической приостановки. Всё просто: выполнение не должно продолжаться, пока результат не существует.При await весь код выполняется синхронно, пока не достигнет I/O или функции, возвращающей Task. Если Task не завершён, происходит раскрутка кадра стека, и поскольку обрамляющие методы приостановлены до самого верха, поток может быть освобождён в пул потоков.Позже задача завершается, продолжение планируется и выполнение возобновляется там, где остановилось. Это не параллельное выполнение, это приостановка и возобновление.Если забыли await:var task = GetDataAsync(); // забыли await Use(task);Это режим «запустил и забыл» (fire-and-forget). Последствия:• выполнение продолжается немедленно • зависимость не обеспечивается
Библиотека шарписта | C#, F#, .NET, ASP.NET
15 Sept, 07:30edited
😭 Как не потратить недельный лимит AI-кодинга за три дня?Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.🔘 Поговорим о том:— когда дорогая модель действительно нужна, а когда хватит дешёвой; — сколько стоит один прогон и куда уходят токены; — какие задачи можно отдавать субагентам; — как настроить маршрутизацию моделей; — что проверять в AI-коде перед merge.✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после.⬇️ 17 сентября, 19:00 МСК ⬇️ 1,5 часа · бесплатно ⬇️ Арсений Харланов и Олег Лайок💬 Пишите в комментариях, где упираетесь в лимиты и на что уходят деньги. Самые залайканные вопросы


Библиотека шарписта | C#, F#, .NET, ASP.NET
14 Sept, 18:00
🧩 Union types появились в ASP.NET Core на .NET 11В C# 15 можно описать тип с несколькими допустимыми вариантами:public union IntOrString(int, string);Такой endpoint может вернуть либо число, либо строку:app.MapGet("/max-unavailable", () => new IntOrString(2));JSON останется обычным:2 или: "25%"Без $type и дополнительных обёрток.Главный плюс — компилятор проверяет, что switch обработал все варианты union.
Библиотека шарписта | C#, F#, .NET, ASP.NET
13 Sept, 14:01
С днем программиста, коллеги!Желаем, чтобы код компилировался с первого раза, баги находились до релиза, а таски «на пять минут» действительно занимали пять минут.И конечно, пусть в жизни будет больше приятных сюрпризов — один из них мы уже подготовили. Скорее переходите по ссылке, трясите коробку и забирайте свой подарок ко Дню программиста: https://tprg.ru/YtJ2


Библиотека шарписта | C#, F#, .NET, ASP.NET
13 Sept, 10:03
🧠 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 в контроллере.📍 Навигация: Вакансии • Задачи • Собесы
Библиотека шарписта | C#, F#, .NET, ASP.NET
13 Sept, 08:50
🌸 Вселенная намекает: пора уже начать этот курсС 14 сентября цены в Proglib Academy вырастут на 20% 👀Так что если курс давно ждёт своего часа — лучше не откладывать ещё на месяц 😏📍 Выбрать курс
Библиотека шарписта | C#, F#, .NET, ASP.NET
12 Sept, 14:01
📍 Навигация: Вакансии • Задачи • Собесы🐸Библиотека шарписта#garbage_collector


Библиотека шарписта | C#, F#, .NET, ASP.NET
12 Sept, 13:04
🌞 Готовим вебинар про AI в разработке и хотим сделать его максимально полезнымЧто реально хочется разобрать? Где чаще всего застреваете? Что пробовали, но так и не получилось нормально внедрить?🤩 Пишите вопросы в комментариях — самые залайканные разберём на вебинаре в первую очередь.Задавайте всё, что давно хотелось спросить 📍📍 Навигация: Вакансии • Задачи • Собесы🐸Библиотека шарписта
Библиотека шарписта | C#, F#, .NET, ASP.NET
10 Sept, 11:49
✏️ Async/Await в C# — шпаргалка➡️ Что такое TaskTask — это обещание, что какое-то событие произойдёт в будущем. Не результат, а именно обещание.Task<T> — то же самое, но с результатом типа T. Когда задача завершится, значение станет доступно.Задача считается завершённой, когда событие произошло или значение получено. Проверить это можно через IsCompleted или Status.➡️ Как дождаться результатаПравильно — асинхронно:• await task — отпускает поток, пока задача не завершится. Поток свободен, приложение не зависает.• ContinueWith(action) — задача сама вызовет ваш колбэк, когда завершится. Полезно, если нужно выстроить цепочку без await.Неправильно — синхронно:
Библиотека шарписта | C#, F#, .NET, ASP.NET
9 Sept, 14:36
🚀 .NET 11 вышел в Release Candidate 18 сентября Microsoft выпустила первый RC .NET 11. У него уже есть Go-Live Support, поэтому сборку можно использовать в production — хотя для критичных систем разумнее дождаться финального релиза.Что главное:→ C# 15 стал default для .NET 11 — union types и closed hierarchies больше не preview;→ runtime получил новые возможности для диагностики и оптимизации, включая crash reporting на Unix и аппаратное ускорение System.Half;→ обновились SDK, MSBuild, NuGet, ASP.NET Core, MAUI и WinForms.🌞 Финальный .NET 11 запланирован на 10 ноября и будет STS-релизом.А 10 ноября заканчивается поддержка .NET 8 и .NET 9. Для них уже вышли сентябрьские security updates: 8.0.31, 9.0.20 и 10.0.12.📍 Навигация: Вакансии • Задачи • Собесы


Библиотека шарписта | C#, F#, .NET, ASP.NET
8 Sept, 13:02
💥 Куда исчезает метод после JIT-компиляции?В C# мы пишем:int Double(int x) => x 2;var result = Double(21);Но JIT может решить, что отдельный вызов здесь вообще не нужен.При inlining тело метода встраивается непосредственно в вызывающий код:🔴 До:call Double ↓ x 2🔴 После:
Библиотека шарписта | C#, F#, .NET, ASP.NET
7 Sept, 17:02
🧪 MSTest 4.4 теперь поддерживает Native AOTТесты тоже должны проверять то, что мы отправляем в production. Native AOT означает trimming, ограничения reflection и отсутствие runtime code generation. Обычный managed-тест может этого не показать.В MSTest 4.4 появился source generation для тестов — test discovery и запуск можно выполнять без зависимости от runtime reflection.<PublishAot>true</PublishAot>В итоге можно прогнать тесты в тех же AOT-условиях, в которых будет работать приложение.Особенно полезно для проектов, где Native AOT — часть production-сборки.📍 Навигация: Вакансии • Задачи • Собесы🐸Библиотека шарписта#async_news
Related Channels
Other channels in the same section of the catalogue.
