Start Debugging

Тег: csharp

341 статей · Страница1из35

2026-10-27 errorsef-coredotnet
Исправление: The property 'X' is part of a key and so cannot be modified or marked as modified в EF Core
EF Core никогда не обновляет значение ключа у отслеживаемой сущности. Не копируйте ключ из DTO, используйте уникальный индекс вместо альтернативного ключа, а настоящий ключ меняйте вставкой новой строки и удалением старой. Проверено на EF Core 10.0.14.
Как синхронно обойти две коллекции без выделений памяти в куче в C#
Enumerable.Zip выделяет 144-208 байт на вызов и работает примерно в 10 раз медленнее обычного цикла. Для массивов и списков цикл for по двум span, обрезанным до одной длины, не выделяет память и работает быстрее всего; для синтаксиса foreach небольшой zip-перечислитель на ref struct отстаёт от него не более чем на 25%. Замеры на .NET 10.0.10 и .NET 11 RC 3.
Polly 8.8.1: circuit breaker больше не удерживает значения AsyncLocal первого вызывающего
Polly.Core 8.8.1 запускает фоновый цикл circuit breaker под ExecutionContext.SuppressFlow, поэтому долгоживущий пайплайн больше не удерживает значения AsyncLocal того, кто его построил. Воспроизведение в 15 строк показывает утечку в 8.8.0 и исправление в 8.8.1.
2026-10-26 dotnetcsharplogging
Как использовать разные шаблоны вывода Serilog для разных уровней журналирования из appsettings.json
outputTemplate задаётся для sink целиком, поэтому для форматирования по уровням нужен либо ExpressionTemplate с блоками {#if @l ...}, либо два вложенных логгера Logger с фильтрами ByIncludingOnly / ByExcluding. Оба варианта настраиваются только через appsettings.json, проверено на Serilog 4.4, Serilog.Settings.Configuration 10.0.1 и Serilog.Expressions 5.0.
Playwright .NET 1.64 добавляет Locator.Within(), и это цепочка Locator, прочитанная задом наперёд
Microsoft.Playwright 1.64 добавляет Locator.Within(), чтобы можно было написать 'эта кнопка внутри того диалога'. Быстрая проверка показывает, что он строит ровно тот же локатор, что и parent.Locator(child), включая разрешение Nth() для каждого родителя.
Lazy<T> vs LazyInitializer.EnsureInitialized vs блокировка с двойной проверкой в C#
По умолчанию используйте Lazy<T>: он выполняет фабрику один раз, кеширует исключения, а чтение после инициализации слишком дёшево, чтобы его можно было измерить. LazyInitializer.EnsureInitialized подходит, когда вы лениво заполняете много полей или ячеек массива и не можете позволить себе лишний объект на каждое значение. Ручная блокировка с двойной проверкой на .NET 10 почти никогда не оправдана.
2026-10-21 mcpdotnetcsharp
MCP C# SDK 2.3: McpClient.ServerInfo теперь допускает null, и ваша сборка это заметит
ModelContextProtocol 2.3.0, выпущенный 20 октября 2026 года, меняет тип McpClient.ServerInfo с Implementation на Implementation?, потому что серверы 2026-07-28 могут не указывать свою идентичность в server/discover. Почему так, что ломается при warnings-as-errors и как это исправить одной строкой.
Как форматировать числа с индийской группировкой разрядов lakh/crore в .NET (NumberGroupSizes)
Используйте культуру en-IN или задайте NumberFormatInfo.NumberGroupSizes равным [3, 2], чтобы в C# выводить 12,34,56,789 вместо 123,456,789. Замеры на .NET 10 и .NET 11 RC1: как работает массив, почему CurrencyGroupSizes задаётся отдельно, ловушка invariant globalization, которая молча выводит западную группировку, и вспомогательный метод для слов lakh/crore.
Вперёд