2026-05-25 comparisoncsharpdotnet List<T> vs Span<T> vs ReadOnlySpan<T> в C#: когда что выбирать List<T> для растущих коллекций, Span<T> для изменяемого представления и ReadOnlySpan<T> для чтения: время жизни, возврат и ограничения async.
2026-05-25 comparisoncsharpdotnet Parallel.ForEach vs Parallel.ForEachAsync vs Task.WhenAll в C# Используйте Parallel.ForEach для нагружающей CPU работы над данными в памяти, Parallel.ForEachAsync для асинхронного ввода-вывода над множеством элементов с ограничением параллелизма, и Task.WhenAll для небольшого фиксированного fan-out, где нужно запустить все операции сразу и получить результаты.
2026-05-25 dotnet-11comparisoncsharp StringBuilder против интерполяции строк в .NET 11: что выбрать? Используйте интерполяцию строк для одноразовой сборки фиксированного набора значений; используйте StringBuilder, когда вы добавляете в цикле или по неизвестному числу фрагментов. Разделительная линия - это цикл, а не количество значений.
2026-05-24 dotnet-11aspnetcoreopenapi ASP.NET Core в .NET 11 Preview 4 обучает OpenAPI методу HTTP QUERY .NET 11 Preview 4 заставляет генерацию OpenAPI в ASP.NET Core распознавать HTTP QUERY как полноценную операцию в OpenAPI 3.2, с аккуратным запасным вариантом для документов 3.0 и 3.1.
2026-05-24 comparisoncsharpdotnet lock vs Monitor vs SemaphoreSlim vs System.Threading.Lock в C# Четыре способа защитить критическую секцию в C# и матрица решений для выбора одного из них. Используйте System.Threading.Lock для синхронной взаимной блокировки на .NET 9+, SemaphoreSlim когда секция охватывает await, и Monitor только когда нужны Wait/Pulse.
2026-05-24 comparisonpollyresilience Polly против resilience handlers в .NET 11: что выбрать? Используйте resilience handler из Microsoft.Extensions.Http.Resilience для вызовов через HttpClient, потому что это Polly с понимающими HTTP значениями по умолчанию и телеметрией в одну строку. Обращайтесь к ResiliencePipeline из Polly напрямую только тогда, когда защищаете нечто, не являющееся HttpClient.
2026-05-24 comparisoncsharpdotnet Task.Run vs Task.Factory.StartNew vs ThreadPool.QueueUserWorkItem Три способа отправить работу в пул потоков в C# и какой выбрать. Используйте Task.Run почти всегда, ThreadPool.QueueUserWorkItem<TState> для fire-and-forget без аллокаций, а Task.Factory.StartNew только для LongRunning или собственного планировщика.
2026-05-23 dotnet-11csharpperformance .NET 11 добавляет сжатие Deflate и GZip без аллокаций .NET 11 Preview 4 приносит DeflateEncoder, GZipEncoder и ZLibEncoder вместе с соответствующими декодерами, позволяя сжимать прямо в Span<byte> через OperationStatus, без всякого Stream.
2026-05-23 comparisonef-coredapper Скомпилированные запросы EF Core vs сырой SQL vs Dapper: что побеждает на пути чтения? Для путей с большим количеством чтений в .NET 11 чистый EF Core с AsNoTracking держится в пределах ~5% от Dapper. Используйте скомпилированные запросы на профилированном горячем пути одной строки, а Dapper только для наименьшей задержки или для SQL, который LINQ не может выразить.
2026-05-23 comparisonhttpclienthttpclientfactory HttpClient vs HttpClientFactory vs Refit: что использовать в .NET 11? Никогда не создавайте HttpClient на каждый запрос. Используйте IHttpClientFactory для управления временем жизни и добавляйте Refit сверху, когда нужен типизированный интерфейс вместо написанного вручную кода запроса. Чистый singleton HttpClient годится лишь для самых простых случаев.