Start Debugging

Тег: csharp

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

.NET Extensions 10.11: буферизованные логи наконец сохраняют свои scope
Microsoft.Extensions.Telemetry 10.11.0, вышедший 2026-10-15, добавляет в глобальную буферизацию логов и буферизацию на уровне запроса экспериментальную опцию IncludeScopes, чтобы OrderId и TenantId из BeginScope переживали Flush(), а не терялись молча.
Что на самом деле копирует выражение `with` в C# и почему вычисляемые свойства record не пересчитываются?
Выражение with вызывает сгенерированный компилятором метод <Clone>$ записи, который запускает конструктор копирования: он копирует каждое поле экземпляра и пропускает все инициализаторы. Поэтому свойства, инициализированные из других свойств, кешированные значения и идентификаторы Guid оказываются устаревшими. Измерения на .NET 10 с C# 14 и исправления, которые действительно работают.
Что такое ref-safe-context в C# и как компилятор определяет его для ref-локальных переменных
ref-safe-context это область, в которой ссылка на переменную остаётся валидной. Разбираем четыре контекста, правило, фиксирующее контекст ref-локальной переменной по её инициализатору, почему ref-переназначение никогда не может ни расширить, ни сузить контекст, и ошибки CS8157, CS8168, CS8374 и CS9079, которые из этого следуют, с выводом компилятора C# 14 на .NET 10 и .NET 11 RC1.
FileSystemWatcher или опрос для обнаружения изменений файлов на сетевой папке в .NET
На SMB- или NFS-ресурсе источником истины служит опрос, а FileSystemWatcher в лучшем случае подсказка. FileSystemWatcher пропускает удалённые изменения на Linux и macOS, переполняет 64-килобайтный сетевой буфер и навсегда останавливается при обрыве соединения. Используйте периодическое сравнение снимков, а наблюдателю оставьте только роль триггера для досрочного сканирования. Проверено на .NET 10.0.10.
Thread.Sleep, Task.Delay и SpinWait для ожидания в C#
Используйте await Task.Delay для любого ожидания по времени в асинхронном коде, Thread.Sleep только на выделенном потоке, которым вы владеете, а SpinWait только для ожиданий короче микросекунды внутри lock-free кода. Чтобы дождаться условия, применяйте сигнал (ManualResetEventSlim, SemaphoreSlim, TaskCompletionSource) вместо любого из этих трёх. Измерено на .NET 10.0.10.
Исправление: FileInfo.Length возвращает устаревший размер файла, в который ещё идёт запись, в Windows
FileInfo кеширует размер, перечисление читает лениво обновляемую запись каталога NTFS, а процесс записи может всё ещё держать байты в своих буферах. Используйте Refresh() или, лучше, читайте длину через общий дескриптор с помощью RandomAccess.GetLength.
FluentValidation 12.2 исправляет падение IsInEnum() в приложениях native AOT на перечислениях [Flags]
FluentValidation 12.2.0, вышедший 10 октября 2026 года, заменяет Enum.GetValues на Enum.GetValuesAsUnderlyingType внутри EnumValidator, поэтому IsInEnum() на перечислении [Flags] больше не выбрасывает NotSupportedException в бинарнике native AOT.
Как отбросить буферизованные нажатия клавиш перед Console.ReadKey в игровом цикле консольного приложения на C#
Очищайте буфер ввода консоли с помощью while (Console.KeyAvailable) Console.ReadKey(true) перед ожиданием новой клавиши и делайте это в каждом кадре игрового цикла, чтобы автоповтор не копился. Как устроен буфер в Windows и Unix в .NET 10, почему зажатые клавиши отстают, ловушка с эхо в Unix и FlushConsoleInputBuffer.
Как проверить, отслеживается ли сущность в DbContext, перед её подключением в EF Core
Используйте DbSet.Local.FindEntry(key), чтобы спросить у трекера изменений, отслеживается ли сущность с заданным ключом, без обращения к базе данных и без перебора. Почему Entry(entity).State вводит в заблуждение, почему Find выполняет запрос, и проверенный помощник AttachOrMerge для EF Core 10.
Назад Вперёд