Start Debugging
RU

Ежедневные заметки о .NET, C#, EF Core, MAUI, Blazor и Flutter для разработчиков, которые выпускают код.

grpc-dotnet 2.85 применяет MaxReceiveMessageSize после распаковки, а не только до неё
Grpc.AspNetCore и Grpc.Net.Client 2.85.0 теперь применяют MaxReceiveMessageSize к распакованному размеру сообщений gzip и deflate. Запрос в 260 КБ, который разворачивается в 256 МиБ, отклоняется с ResourceExhausted, но и легитимные крупные сжатые данные могут начать завершаться ошибкой.
Итератор yield return или возврат List<T>: сколько на самом деле стоит метод с IEnumerable в C#
Метод с yield return стоит один 40-байтовый объект конечного автомата на вызов, сколько бы элементов он ни выдавал; List<T> сразу выделяет весь внутренний массив. Замеры на .NET 10.0.10: итератор выигрывает по памяти и при раннем выходе, List<T> выигрывает, когда вызывающий код перечисляет больше одного раза, нуждается в Count или вызывает ToList().
Сеттер FileSystemInfo.LastWriteTime или File.SetLastWriteTime в .NET
Оба пути заканчиваются одним и тем же вызовом ОС, поэтому записанная метка времени идентична. Различия кроются вокруг этого вызова: какой кеш сбрасывается, работают ли каталоги в Windows, как преобразуется DateTime не в UTC и можно ли указать открытый дескриптор. Используйте File.SetLastWriteTimeUtc, а для открытого файла передавайте дескриптор. Проверено на .NET 10.0.10.
Marten 9.55 исправляет турецкую I в именах таблиц документов: переименуйте таблицы до обновления
Marten 9.55.0 приводит к нижнему регистру псевдонимы документов, ключи шаблонов DDL и имена функций upsert для плоских таблиц с помощью инвариантной культуры. Приложения под tr-TR или az-AZ, хранящие документы в таблицах вроде mt_doc_ınvoice, должны сначала переименовать их, иначе данные будут выглядеть пропавшими.
Цикл по ref T против индексации Span<T> в C#: почему версия со span не медленнее, а часто быстрее в .NET 10
В .NET 10 обычный цикл for по span[i] с границей span.Length компилируется в цикл без проверки границ, со снижением стоимости операций (strength reduction) и обратным отсчётом. Написанный вручную цикл с Unsafe.Add(ref r, i) и индексом int сохраняет расширение знака и сравнение при счёте вверх и в замерах оказался на 2-5% медленнее. Бенчмарки и дизассемблер JIT для arm64 и x64 на .NET 10.0.10.
shared_preferences или JSON-файл через path_provider для хранения настроек во Flutter
shared_preferences (SharedPreferencesWithCache) подходит для нескольких плоских флагов, а JSON-файл в getApplicationSupportDirectory подходит для структурированного объекта настроек. Разбираем атомарную запись, состояние гонки при параллельных сохранениях, ловушку с папкой Documents в Windows и Linux, поддержку веба и измеренную стоимость записи на Flutter 3.44.8.
Исправление: восстановление NuGet в Azure DevOps завершается ошибкой "Unable to find version 'x.y.z' of package" для внутреннего фида
Версия существует, но пайплайн её не видит. Проверьте роль удостоверения сборки на фиде, представление фида в URL, какой nuget.config использует задача, сопоставление источников пакетов и 30-минутный HTTP-кеш.
MudBlazor 9.12: медленные ServerData и поиск в Autocomplete больше не перезаписывают более новые результаты
MudBlazor 9.12.0 исправляет давнюю гонку в MudAutocomplete, MudDataGrid и MudTable: побеждал результат поиска, завершившегося последним, а не запущенного последним. Разбираем, как работает исправление и что меняется в вашем коде ServerData и SearchFunc.