Возможности C# 14
Что на самом деле вошло в C# 14, с кодом.
Эта подборка собирает всё, что я писал о возможностях языка C# 14: union-типы, partial-конструкторы и события, extension-типы и мелкие эргономические улучшения, которые легко пропустить в официальных release notes.
С чего начать
Если вы переходите с C# 12, начните со статей об union-типах и partial-членах - это самые заметные изменения поведения. Остальное - улучшения удобства.
Что на этой странице
Список ниже автоматически собирает статьи с любым из тегов: c# 14, csharp 14, c#, csharp, c# language. Сначала самые новые.
Указатель (138 статей)
2026 / 05
- .NET 11 добавляет захват вывода процессов без взаимных блокировок
.NET 11 Preview 4 представляет новые API System.Diagnostics.Process, которые параллельно вычитывают stdout и stderr, плюс однострочные хелперы запуска с захватом и KillOnParentExit.
- Fix: A possible object cycle was detected
System.Text.Json отказывается сериализовать графы с обратными ссылками. Установите ReferenceHandler.IgnoreCycles, спроецируйте на DTO или пометьте обратный указатель атрибутом [JsonIgnore]. Preserve - крайнее средство.
- Исправление: SqlException: Timeout expired при миграциях EF Core
Миграции используют DbContext времени проектирования, а не ваш CommandTimeout времени выполнения. Установите таймаут через UseSqlServer(o => o.CommandTimeout(...)), Command Timeout в строке подключения или Database.SetCommandTimeout перед Migrate().
- Исправление: System.Text.Json.JsonException: The JSON value could not be converted
System.Text.Json выбрасывает это исключение, когда входящий JSON-токен не соответствует целевому типу CLR. Согласуйте JSON с типом или зарегистрируйте JsonConverter или JsonSerializerOption, которые их связывают.
- Исправление: System.Security.Cryptography.CryptographicException: Keyset does not exist
Закрытый ключ сертификата лежит в отдельном файле ключей Windows, который текущий процесс не может прочитать. Настройте ACL, загрузите PFX с MachineKeySet или используйте EphemeralKeySet.
- Исправление: System.IO.FileNotFoundException: Could not load file or assembly в опубликованном приложении
Работает с dotnet run, падает после dotnet publish. DLL обычно отсутствует в папке публикации, а не в среде выполнения. Проверьте deps.json, Private у ProjectReference и trimming.
- Исправление: InvalidOperationException: Synchronous operations are disallowed
Замените вызов Stream.Read или Write на ReadAsync/WriteAsync. В крайнем случае установите AllowSynchronousIO в Kestrel, IIS или поштучно через IHttpBodyControlFeature.
- Fix: RZ10012: Found markup element with unexpected name в Blazor
Компилятор Razor в Blazor выдаёт RZ10012, когда тег в PascalCase не связан с типом компонента в области видимости. Добавьте @using для пространства имён компонента в _Imports.razor или @namespace в самом компоненте, затем пересоберите проект.
- Fix: dotnet ef migrations add падает с 'Unable to create an object of type DbContext'
Инструменты EF Core времени проектирования не смогли создать экземпляр вашего DbContext. Предоставьте host через WebApplication.CreateBuilder, укажите правильный startup project или реализуйте IDesignTimeDbContextFactory.
- Fix: MSB3027 Could not copy X to Y. Exceeded retry count of 10. Failed
MSB3027 означает, что MSBuild десять раз пытался скопировать файл, а процесс по-прежнему удерживал место назначения. Завершите блокирующий процесс, исключите bin/obj из антивируса или повысьте CopyRetryCount.
- Fix: The type or namespace name 'X' could not be found (после добавления ProjectReference)
CS0246 сразу после свежей ProjectReference почти всегда означает несовпадение TargetFramework, устаревшую папку obj/ или отсутствующую директиву using. Пять решений по убыванию вероятности.
- Решение: Cannot consume scoped service 'X' from singleton 'Y'
Валидация области в ASP.NET Core выбрасывает это, когда singleton захватил бы scoped-зависимость на весь процесс. Сделайте потребителя scoped или внедрите IServiceScopeFactory и создавайте область по требованию.
- Fix: PlatformNotSupportedException: Operation is not supported on this platform в Native AOT
Native AOT убирает JIT и интерпретатор, поэтому reflection emit, компиляция деревьев выражений и невиденные MakeGenericType бросают во время выполнения. Найдите вызов через IL3050 и замените его на генератор исходного кода или заранее подготовленный путь.
- Исправление: Unable to resolve service for type 'X' while attempting to activate 'Y'
ASP.NET Core выбрасывает это исключение, когда конструктор запрашивает тип, который никогда не был зарегистрирован, был зарегистрирован в другом контейнере или был добавлен после построения хоста. Три конкретных исправления покрывают почти все случаи.
- Исправление: TaskCanceledException: A task was canceled в HttpClient
HttpClient выбрасывает TaskCanceledException по трём разным причинам: таймаут, отмена со стороны вызывающего кода или прерывание на уровне соединения. Различайте их с помощью InnerException и CancellationToken.IsCancellationRequested и устраняйте именно ту, что нужно.
- Fix: The JSON value could not be converted to System.DateTime
System.Text.Json принимает для DateTime только строки в ISO 8601. Отправляйте 2026-05-08T14:00:00Z или зарегистрируйте JsonConverter, разбирающий ваш формат. Пустые строки и Unix-таймстампы тоже бросают исключение.
- Workflow в Microsoft Agent Framework теперь переживают перезапуск процесса благодаря стеку Durable Task
Оберните Workflow Agent Framework в Microsoft.Agents.AI.DurableTask, и каждый шаг исполнителя получает чекпоинт. Падение, передеплой, перезапуск: запуск продолжится с того же места.
- Исправление: The instance of entity type cannot be tracked because another instance with the same key value is already being tracked
EF Core 11 выбрасывает это исключение, когда два объекта делят первичный ключ внутри одного DbContext. Отсоедините старый или обновите его на месте. AsNoTracking при чтении предотвращает коллизию.
- Исправление: A second operation was started on this context instance before a previous operation completed
EF Core выбрасывает это исключение, когда два await выполняются параллельно на одном DbContext. Ожидайте каждый вызов последовательно или получайте новый DbContext на каждую конкурентную единицу работы через IDbContextFactory.
- Microsoft Agent Framework пропускает рискованные вызовы инструментов через FunctionApprovalRequestContent
Оберните AIFunction в ApprovalRequiredAIFunction, и агент остановится посреди выполнения, чтобы запросить разрешение. Вот как работает поток запроса и ответа в C#.
- Исправление: System.InvalidOperationException: No connection string named 'DefaultConnection' could be found
Если GetConnectionString возвращает null в .NET 11, в вашем appsettings.json нет ключа, файл не копируется в выходной каталог сборки или выбран не тот файл окружения. Три проверки решают 95% случаев.
- Как преобразовать T[] в ReadOnlyMemory<T> в C# (неявный оператор и явный конструктор)
Три способа обернуть T[] в ReadOnlyMemory<T> в .NET 11: неявное преобразование, явный конструктор и AsMemory(). Когда что выбрать.
- Как реализовать drag-and-drop в .NET MAUI 11
Полный drag-and-drop в .NET MAUI 11: DragGestureRecognizer, DropGestureRecognizer, пользовательские полезные нагрузки DataPackage, AcceptedOperation, позиция жеста и платформенные ловушки PlatformArgs на Android, iOS, Mac Catalyst и Windows.
- Как правильно поддержать тёмную тему в приложении .NET MAUI
Тёмная тема от и до в .NET MAUI 11: AppThemeBinding, SetAppThemeColor, RequestedTheme, переопределение через UserAppTheme с сохранением, событие RequestedThemeChanged и платформенные нюансы Info.plist и MainActivity, о которых документация умалчивает.
- Как использовать Tailwind CSS с Blazor WebAssembly в .NET 11
Полная настройка Tailwind CSS v4 в приложении Blazor WebAssembly на .NET 11: standalone CLI (без Node), цель MSBuild, директивы @source для файлов Razor и CSS-изоляции, и конвейер публикации, который выживает после Native AOT.
- Как обнаружить запросы N+1 в EF Core 11
Практическое руководство по выявлению запросов N+1 в EF Core 11: как этот шаблон выглядит в реальном коде, как сделать его видимым через журналы, диагностические перехватчики, OpenTelemetry, и тест, который ломает сборку при регрессии горячего пути.
- Как использовать скомпилированные запросы EF Core на горячих путях
Практическое руководство по скомпилированным запросам в EF Core 11: когда EF.CompileAsyncQuery действительно даёт выигрыш, шаблон со статическим полем, подводные камни Include и отслеживания, и как замерить производительность до и после, чтобы убедиться, что дополнительная церемония оправдана.
- Как написать MAUI-приложение, работающее только на Windows и macOS (без мобильных)
Уберите Android и iOS из проекта .NET MAUI 11, чтобы он публиковался только под Windows и Mac Catalyst: правки csproj, команды workload и multi-targeting, который сохраняет код чистым.
- Как настроить структурированное журналирование с Serilog и Seq в .NET 11
Полное руководство по подключению Serilog 4.x и Seq 2025.2 к приложению .NET 11 ASP.NET Core: AddSerilog против UseSerilog, двухэтапное журналирование при старте, конфигурация через JSON, обогатители, журналирование запросов, корреляция трассировок OpenTelemetry, API-ключи и продакшн-нюансы вокруг буферизации, хранения и уровня сигнала.
- Как использовать OpenTelemetry с .NET 11 и бесплатным бэкендом
Подключите трейсы, метрики и логи OpenTelemetry в приложение ASP.NET Core .NET 11 через OTLP-экспортёр и отправляйте данные на бесплатный самохостинг-бэкенд: standalone Aspire Dashboard для локальной разработки, Jaeger и SigNoz для самохостинговой продакшн-среды и OpenTelemetry Collector, когда нужны и тот и другой.
- Как писать интеграционные тесты против настоящего SQL Server с помощью Testcontainers
Полное руководство по запуску интеграционных тестов ASP.NET Core против настоящего SQL Server 2022 с использованием Testcontainers 4.11 и EF Core 11: настройка WebApplicationFactory, IAsyncLifetime, подмена регистрации DbContext, применение миграций, параллелизм, очистка через Ryuk и подводные камни CI.
2026 / 04
- Как добавить ограничение скорости для отдельных endpoint в ASP.NET Core 11
Полное руководство по ограничению скорости (rate limiting) для отдельных endpoint в ASP.NET Core 11: когда выбирать fixed window против sliding window, token bucket или concurrency, чем отличаются RequireRateLimiting и [EnableRateLimiting], партиционирование по пользователю или IP, callback OnRejected и ловушка распределённого развёртывания, в которую попадают все.
- Как использовать новый тип System.Threading.Lock в .NET 11
System.Threading.Lock появился в .NET 9 и стал стандартной примитивой синхронизации в .NET 11 и C# 14. Это руководство показывает, как мигрировать с lock(object), как работает EnterScope и какие подводные камни связаны с await, dynamic и поддержкой старых таргетов.
- Как написать генератор исходного кода для INotifyPropertyChanged
Полное руководство по созданию собственного инкрементального генератора исходного кода для INotifyPropertyChanged в C# 14 и .NET 11: пайплайн IIncrementalGenerator, маркерные атрибуты, вывод partial class, паттерн SetProperty и как оставаться совместимым с AOT.
- Как определить, что запись файла в .NET завершена
FileSystemWatcher срабатывает на Changed до того, как писатель закончил. Три надёжных паттерна для .NET 11, чтобы узнать, что файл полностью записан: открытие с FileShare.None, дебаунс по стабилизации размера и трюк с переименованием на стороне продьюсера, который полностью устраняет проблему.
- Как разделить логику валидации между сервером и Blazor WebAssembly
Главный источник расхождений в валидации между Blazor WebAssembly клиентом и ASP.NET Core API -- это соблазн писать правила дважды. Это руководство показывает единственную раскладку, которая масштабируется в .NET 11: библиотека классов Shared, владеющая DTO и их валидаторами, потребляемая и WASM клиентом (EditForm + DataAnnotationsValidator или Blazored.FluentValidation), и сервером (фильтр endpoint в minimal API или model binding в MVC), с протестированным циклом, который возвращает серверные ValidationProblemDetails обратно в EditContext.
- Как правильно использовать SearchValues<T> в .NET 11
SearchValues<T> обгоняет IndexOfAny в 5-250 раз, но только если использовать его так, как ожидает среда выполнения. Правило кеширования через static, ловушка StringComparison, когда не стоит и недокументированный трюк инверсии через IndexOfAnyExcept.
- Как использовать Native AOT с минимальными API ASP.NET Core
Полное руководство для .NET 11 по выпуску минимального API ASP.NET Core с Native AOT: PublishAot, CreateSlimBuilder, JSON с генератором исходного кода, ограничение AddControllers, предупреждения IL2026 / IL3050 и EnableRequestDelegateGenerator для библиотечных проектов.
- Как прогреть модель EF Core до первого запроса
EF Core строит свою концептуальную модель лениво при первом обращении к DbContext, поэтому первый запрос в свежем процессе на несколько сотен миллисекунд медленнее любого последующего. Это руководство охватывает три реальных решения в EF Core 11: стартовый IHostedService, который трогает Model и открывает соединение, dotnet ef dbcontext optimize для поставки предкомпилированной модели, и подводные камни ключа кеша, которые всё равно молча перестраивают модель.
- Как добавить глобальный фильтр исключений в ASP.NET Core 11
Полное руководство по глобальной обработке исключений в ASP.NET Core 11: почему IExceptionFilter — неподходящий инструмент, как IExceptionHandler и UseExceptionHandler работают вместе, ответы ProblemDetails, цепочки из нескольких обработчиков и ломающее изменение в .NET 10 о подавлении диагностики.
- Как построить собственный MCP-сервер на C# в .NET 11
Постройте рабочий сервер Model Context Protocol на C# 14 / .NET 11, используя официальный SDK ModelContextProtocol 1.2. Рассмотрены транспорт stdio, атрибуты [McpServerTool], внедрение зависимостей, ловушка с журналированием в stderr и регистрация в Claude Code, Claude Desktop и VS Code.
- Как мокать DbContext, не ломая отслеживание изменений
Прямое мокание DbContext незаметно ломает ChangeTracker, поэтому Microsoft не рекомендует так делать. Это руководство показывает два паттерна, которые действительно работают в EF Core 11: SQLite в памяти с удерживаемым открытым соединением, чтобы запускался настоящий ChangeTracker, и паттерн репозитория, полностью убирающий EF Core из теста.
- Как писать модульные тесты для кода, использующего HttpClient
Полное руководство по тестированию HttpClient в .NET 11: почему не стоит мокать HttpClient напрямую, как написать stub HttpMessageHandler, заменить primary handler через IHttpClientFactory, проверить повторы Polly и вариант WireMock.Net.
- Как использовать Channels вместо BlockingCollection в C#
System.Threading.Channels это асинхронная замена BlockingCollection в .NET 11. В руководстве показано, как мигрировать, как выбирать между ограниченным и неограниченным каналом, и как обрабатывать backpressure, отмену и корректное завершение без deadlock-ов.
- Как написать пользовательский JsonConverter в System.Text.Json
Полное руководство по написанию пользовательского JsonConverter<T> для System.Text.Json в .NET 11: когда он действительно нужен, как корректно работать с Utf8JsonReader, как обрабатывать обобщённые типы с помощью JsonConverterFactory и как оставаться совместимым с AOT.
- Как генерировать строго типизированный клиентский код из спецификации OpenAPI в .NET 11
Используйте Kiota, официальный генератор OpenAPI от Microsoft, для создания fluent-клиента на C# со строгой типизацией из любой спецификации OpenAPI. Пошагово: установка, генерация, подключение к DI в ASP.NET Core и настройка аутентификации.
- Как отменить долго работающую Task в C# без взаимной блокировки
Кооперативная отмена с CancellationToken, CancelAsync, Task.WaitAsync и связанными токенами в .NET 11. Плюс блокирующие паттерны, превращающие чистую отмену в дедлок.
- Как использовать IAsyncEnumerable<T> с EF Core 11
Запросы EF Core 11 напрямую реализуют IAsyncEnumerable<T>. Как стримить строки через await foreach, когда предпочесть его вместо ToListAsync, и подводные камни со соединениями, трекингом и отменой.
- Как правильно использовать records с EF Core 11
Практическое руководство по сочетанию records C# и EF Core 11. Где records подходят, где они ломают change tracking, и как моделировать value objects, сущности и проекции, не воюя с фреймворком.
- Node.js Addons на C#: .NET Native AOT заменяет C++ и node-gyp
Команда C# Dev Kit сменила свой C++ Node.js addon на библиотеку .NET 10 Native AOT, используя N-API, UnmanagedCallersOnly и LibraryImport для производства единого файла .node без Python и node-gyp.
- Как вернуть несколько значений из метода в C# 14
Семь способов вернуть больше одного значения из метода C# 14: именованные кортежи, out-параметры, records, структуры, деконструкция и трюк с extension members для типов, которыми вы не владеете. Реальные бенчмарки и таблица решений в конце.
- RyuJIT обрезает больше bounds checks в .NET 11 Preview 3: index-from-end и i + константа
.NET 11 Preview 3 учит RyuJIT убирать избыточные bounds checks в последовательных index-from-end обращениях и в паттернах i + константа < length, снижая давление branch в плотных циклах.
- RegexOptions.AnyNewLine приземляется в .NET 11 Preview 3: Unicode-aware anchors без хаков \r?
.NET 11 Preview 3 добавляет RegexOptions.AnyNewLine так, что ^, $, \Z и . распознают любую Unicode-последовательность newline, включая \r\n, NEL, LS и PS, с \r\n трактуемым как один атомарный разрыв.
- EF Core 11 вырезает ненужные reference joins в split queries
EF Core 11 Preview 3 убирает избыточные to-one joins из split queries и роняет ненужные ORDER BY ключи. Один заявленный сценарий стал на 29% быстрее, другой на 22%. Вот как теперь выглядит SQL.
- System.Text.Json в .NET 11 Preview 3 добавляет PascalCase и политики именования на уровне члена
.NET 11 Preview 3 завершает историю с политиками именования в System.Text.Json: JsonNamingPolicy.PascalCase, атрибут [JsonNamingPolicy] на уровне члена и дефолт [JsonIgnore] на уровне типа для более чистых DTO.
- EF Core 11 добавляет GetEntriesForState, чтобы пропустить DetectChanges
EF Core 11 Preview 3 вводит ChangeTracker.GetEntriesForState, state-фильтрованный enumerator, избегающий лишнего прохода DetectChanges в hot paths вроде SaveChanges interceptors и audit hooks.
- Создание движка базы данных с микросекундной задержкой на C#
Проект Typhon Лоика Бауманна нацелен на ACID-коммиты за 1-2 микросекунды с использованием ref struct, аппаратных интринсиков и закреплённой памяти, доказывая, что C# может конкурировать на уровне системного программирования.
- Пользовательские операторы составного присваивания в C# 14: += in-place без лишней аллокации
C# 14 позволяет перегружать +=, -=, *= и компанию как void-методы экземпляра, мутирующие приёмник in-place, сокращая аллокации для крупных хранителей значений вроде буферов в стиле BigInteger и тензоров.
- Как дефолтные nvarchar-параметры Dapper молча убивают ваши индексы SQL Server
C#-строки, отправленные через Dapper, по умолчанию становятся nvarchar(4000), заставляя SQL Server выполнять implicit conversion и полные scan индекса. Вот как починить через DbType.AnsiString.
- .NET 11 добавляет нативное Zstandard-сжатие в System.IO.Compression
.NET 11 Preview 1 поставляет ZstandardStream, ZstandardEncoder и ZstandardDecoder в System.IO.Compression, давая быструю встроенную поддержку zstd без сторонних пакетов.
- EF Core 11 позволяет создать и применить миграцию одной командой
Команда dotnet ef database update теперь принимает --add для создания и применения миграции в одном шаге. Вот как это работает, почему это важно для контейнеров и .NET Aspire, и на что обратить внимание.
- EF Core 11 добавляет нативный векторный поиск SQL Server с индексами DiskANN
EF Core 11 Preview 2 поддерживает VECTOR_SEARCH() из SQL Server 2025 и векторные индексы DiskANN прямо из LINQ. Вот как настроить индекс, выполнять приближённые запросы, и что меняется по сравнению с подходом VectorDistance из EF Core 10.
- ReSharper приходит в VS Code и Cursor, бесплатно для некоммерческого использования
JetBrains выпустила ReSharper как расширение для VS Code с полным анализом C#, рефакторингом и юнит-тестированием. Работает также в Cursor и Google Antigravity, и ничего не стоит для OSS и обучения.
- Union-типы C# 15 здесь: типы-объединения поставляются в .NET 11 Preview 2
C# 15 вводит ключевое слово union для типов-объединений с исчерпывающим сопоставлением с образцом и неявными преобразованиями. Доступно прямо сейчас в .NET 11 Preview 2.
- Microsoft Agent Framework 1.0: создание ИИ-агентов на чистом C#
Microsoft Agent Framework достигает 1.0 со стабильными API, мульти-провайдерными коннекторами, мульти-агентной оркестрацией и совместимостью A2A/MCP. Вот как это выглядит на практике в .NET 10.
- Runtime Async из .NET 11 заменяет state machines более чистыми трассировками стека
Runtime Async в .NET 11 переносит обработку async/await из state machines, генерируемых компилятором, в саму среду выполнения, давая читаемые трассировки стека, корректные точки останова и меньше выделений в куче.
2026 / 02
- Члены расширений в C# 14: свойства расширений, операторы и статические расширения
C# 14 вводит члены расширений, позволяя добавлять свойства расширений, операторы и статические члены к существующим типам с помощью нового ключевого слова extension.
- Идея для C# 14: интерцепторы могли бы сделать генерацию исходного кода System.Text.Json автоматической
Обсуждение в сообществе предложило использовать интерцепторы C# 14 для переписывания вызовов JsonSerializer, чтобы они автоматически использовали сгенерированный JsonSerializerContext, сохраняя AOT-совместимую генерацию исходного кода с более чистыми точками вызова.
- Null-условное присваивание в C# 14: использование ?. и ?[] в левой части
C# 14 расширяет null-условные операторы, позволяя использовать их в левой части присваиваний и устраняя многословные проверки на null при установке свойств или индексаторов.
- Polars.NET: движок DataFrame на Rust для .NET 10, опирающийся на LibraryImport
Новый проект Polars.NET в тренде после поста сообщества от 6 февраля 2026 года. Заголовок прост: дружественный к .NET API DataFrame, поддерживаемый Rust Polars, со стабильным C ABI и interop на основе LibraryImport, чтобы поддерживать низкие накладные расходы.
2026 / 01
- Приложение заметок "только локально" на WinUI 3 - правильная скучность: offline-first, SQLite, упор на клавиатуру
Miyanyedi Quick Note - это приложение заметок на WinUI 3 + SQLite, offline-first и дружественное к приватности. Почему "только локально" - это фича, плюс минимальный SQLite-сниппет для десктопных приложений на .NET 8.
- CV Shortlist: SaaS на .NET 10 с ИИ стал open-source, и стек стоит изучить
CV Shortlist - это open-source SaaS на .NET 10, который сочетает Azure Document Intelligence с моделью OpenAI. Стек, дисциплина конфигурации и граница интеграции с ИИ заслуживают изучения.
- ModularPipelines V3: пишите CI-пайплайны на C#, отлаживайте локально и перестаньте нянчить YAML
ModularPipelines V3 позволяет писать CI-пайплайны на C# вместо YAML. Запускайте их локально через dotnet run, получайте безопасность времени компиляции и отлаживайте с точками останова.
- Microsoft `mcp`: подключаем серверы Model Context Protocol на C# в .NET 10
Как подключить серверы Model Context Protocol (MCP) на C# в .NET 10 с помощью microsoft/mcp. Контракты инструментов, валидация ввода, аутентификация, наблюдаемость и шаблоны для продакшна.
- C# 13: конец выделениям `params`
C# 13 наконец устраняет скрытое выделение массива за params. Теперь params можно использовать со Span, ReadOnlySpan, List и другими типами коллекций для вариадических методов без выделений.
- Предложение C#: дискриминированные объединения
Обзор предложения о дискриминированных объединениях в C#: ключевое слово union, исчерпывающее сопоставление с образцом и как оно может заменить библиотеки OneOf и иерархии классов.
2025 / 04
- C# 14: упрощённые параметры с модификаторами в лямбдах
В C# 14 модификаторы ref, out, in, scoped и ref readonly можно применять к лямбда-параметрам с неявно выводимыми типами, что избавляет от необходимости явно указывать типы параметров.
- Partial-конструкторы и события в C# 14
C# 14 позволяет объявлять конструкторы экземпляров и события как partial-члены, разделяя определения между файлами для более чистой генерации кода и разделения ответственности.
- C# 14: поддержка nameof для несвязанных универсальных типов
C# 14 расширяет выражение nameof, добавляя поддержку несвязанных универсальных типов, таких как List<> и Dictionary<,>, устраняя необходимость в фиктивных аргументах типа.
- Неявные преобразования Span в C# 14: первоклассная поддержка Span и ReadOnlySpan
C# 14 добавляет встроенные неявные преобразования между Span, ReadOnlySpan, массивами и строками, что даёт более чистые API, лучшее выведение типов и меньше ручных вызовов AsSpan().
- C# 14: ключевое слово field и свойства, опирающиеся на field
C# 14 вводит контекстное ключевое слово field в акцессорах свойств, позволяя добавлять собственную логику к авто-свойствам без отдельного объявления резервного поля.
2025 / 01
- Производительность .NET: ToList vs ToArray
.NET 9 значительно улучшает производительность ToArray за счёт InlineArray, делая его быстрее и экономнее по памяти, чем ToList. Смотрите бенчмарки сравнения .NET 8 и .NET 9.
- C# 13: используйте params-коллекции с любым распознаваемым типом коллекции
C# 13 расширяет модификатор params за пределы массивов, поддерживая Span, ReadOnlySpan, IEnumerable и другие типы коллекций, что уменьшает шаблонный код и повышает гибкость.
- Как перейти на C# 13
Как исправить 'Feature is not available in C# 12.0' и перевести проект на C# 13, изменив target framework или задав LangVersion в файле .csproj.
2024 / 12
- Что нового в C# 14.0
Обзор всех новых возможностей C# 14.0, включая ключевое слово field, члены расширения, null-условное присваивание, неявные преобразования span и многое другое.
- История версий языка C#
Эволюция C# превратила его в современный высокопроизводительный язык. Это руководство отслеживает каждую важную веху. Ранние годы (C# 1.0 - 1.2). C# был выпущен в 2002 году как основной язык для .NET Framework. Он напоминал Java, но с фокусом на разработке под Windows. Версия 1.2 появилась вскоре после с небольшими...
2023 / 11
- C# Случайный выбор элементов из списка
В C# можно случайным образом выбирать элементы из списка с помощью Random.GetItems — метода, появившегося в .NET 8. Узнайте, как это работает, на практических примерах.
- MAUI: как регистрировать обработчики в библиотеке
Узнайте, как регистрировать обработчики представлений и сервисы внутри библиотеки .NET MAUI с использованием паттерна builder и методов расширения MauiAppBuilder.
- Как исправить: 'Point' не имеет предопределённого размера, поэтому sizeof можно использовать только в unsafe-контексте
Исправление ошибки C#, когда sizeof нельзя использовать с Point вне unsafe-контекста. Два решения: включить unsafe-код или использовать Marshal.SizeOf.
- C# Доступ к backing field приватного свойства с помощью Unsafe Accessor
Используйте UnsafeAccessorAttribute в .NET 8 для доступа к автоматически генерируемым backing field приватных авто-свойств в C# без рефлексии.
- C# ZIP-файлы в Stream
.NET 8 включает новые перегрузки CreateFromDirectory и ExtractToDirectory, которые позволяют создавать и извлекать ZIP-файлы напрямую в Stream и из него, без записи на диск.
- Производительность .NET 8: GetGenericTypeDefinition в 10 раз быстрее
Бенчмарки GetGenericTypeDefinition в .NET 8 по сравнению с .NET 7 показывают почти 10-кратный рост производительности. Смотрите код бенчмарка и результаты, полученные с помощью BenchmarkDotNet.
- Как сделать скриншот в .NET core
Научитесь делать снимок всего рабочего стола из консольного приложения .NET с помощью System.Windows.Forms. Решение только для Windows, охватывающее все мониторы.
- C# Как обновить readonly-поле с помощью UnsafeAccessor
Узнайте, как в C# обновить readonly-поле с помощью UnsafeAccessor — альтернативы рефлексии без потерь производительности. Доступно в .NET 8.
- Производительность .NET 8: UnsafeAccessor против рефлексии
Бенчмарк UnsafeAccessor против рефлексии в .NET 8. Посмотрите, как UnsafeAccessor добивается производительности без накладных расходов по сравнению с классической рефлексией.
2023 / 10
- C# Как помечать функциональность как экспериментальную
Начиная с C# 12, новый ExperimentalAttribute позволяет помечать типы, методы, свойства или сборки как экспериментальные. Узнайте, как использовать его с diagnosticId, pragma-тегами и UrlFormat.
- C# параметры ref readonly
Модификатор ref readonly в C# даёт более прозрачный способ передавать ссылки только для чтения. Узнайте, как он улучшает модификатор in за счёт более чётких ограничений и видимости для вызывающей стороны.
- C# как перемешать массив?
Самый простой способ перемешать массив в C# — использовать Random.Shuffle, появившийся в .NET 8. Метод работает in-place как с массивами, так и со спанами.
- C# Что такое NullReferenceException и как её исправить?
Узнайте, что вызывает NullReferenceException в C#, как её отлаживать и как предотвращать с помощью проверок на null, оператора null-conditional и ссылочных типов, допускающих null.
- Добавление/удаление TypeInfoResolver у существующих JsonSerializerOptions
Узнайте, как добавлять или удалять экземпляры TypeInfoResolver у существующих JsonSerializerOptions с помощью нового свойства TypeInfoResolverChain в .NET 8.
- C# 12 Interceptors
Знакомимся с interceptors из C# 12 — экспериментальной возможностью компилятора в .NET 8, позволяющей подменять вызовы методов на этапе компиляции с помощью атрибута InterceptsLocation.
2023 / 09
- Implementation type Data.AppDbContext can't be converted to service type Microsoft.AspNetCore.Identity.IUserStore
Исправляем ошибку ASP.NET Core Identity, когда AppDbContext не может быть преобразован в IUserStore, добавлением AddEntityFrameworkStores в конфигурацию identity.
- .NET 8 сериализация свойств из иерархий интерфейсов
.NET 8 добавляет поддержку сериализации свойств из иерархий интерфейсов, включая все свойства всех интерфейсов в зависимости от объявленного типа переменной.
- .NET 8 десериализация в непубличные свойства
Узнайте, как в .NET 8 десериализовать JSON в непубличные свойства с помощью атрибута JsonInclude и параметризованных конструкторов.
- .NET 8 как использовать JsonStringEnumConverter с native AOT
Узнайте, как использовать новый JsonStringEnumConverter<TEnum> в .NET 8 для совместимой с native AOT сериализации перечислений в System.Text.Json.
- The type or namespace name InterceptsLocationAttribute could not be found
Как исправить ошибку CS0246 для InterceptsLocationAttribute в interceptors C#, объявив атрибут самостоятельно.
- .NET 8 пометить JsonSerializerOptions как readonly
Узнайте, как в .NET 8 пометить экземпляры JsonSerializerOptions как только для чтения с помощью MakeReadOnly и как проверить свойство IsReadOnly.
- .NET 8 сериализация Half, Int128 и UInt128
В .NET 8 System.Text.Json добавляет встроенную поддержку сериализации числовых типов Half, Int128 и UInt128.
- .NET 8 Memory<byte> сериализуется как base64
Начиная с .NET 8, и Memory<byte>, и ReadOnlyMemory<byte> сериализуются как строки Base64, тогда как другие типы вроде Memory<int> остаются JSON-массивами.
- .NET 8 включаем непубличные члены в JSON-сериализацию
Узнайте, как в .NET 8 включить private, protected и internal свойства в JSON-сериализацию с помощью атрибута JsonInclude.
2023 / 08
- C# 12 Inline arrays
Inline arrays позволяют создать массив фиксированного размера внутри struct. Такая структура с inline-буфером по производительности сравнима с unsafe fixed size buffer. Inline arrays в первую очередь рассчитаны на команду runtime и некоторых авторов библиотек для улучшения производительности в определённых сценариях. Скорее всего...
- C# 12 collection expressions
C# 12 вводит новый упрощённый синтаксис создания массивов. Выглядит он так: Важно: тип массива должен быть указан явно, поэтому использовать var для объявления переменной нельзя. Аналогично, чтобы создать Span<int>, можно сделать так: Многомерные массивы Преимущества этого лаконичного синтаксиса...
- C# Как дождаться завершения процесса?
Дождаться завершения процесса можно с помощью метода WaitForExit. Ваш код синхронно подождёт, пока процесс завершится, и затем продолжит выполнение. Рассмотрим пример: Этот код запустит новый процесс cmd.exe и выполнит команду timeout 5. Вызов process.WaitForExit() заставит вашу программу...
- C# 12 alias для любых типов
Директива using alias в C# 12 стала более гибкой и теперь позволяет создавать алиасы для любых типов, а не только для именованных. Это значит, что вы можете создавать алиасы для tuples, указателей, массивов, обобщённых типов и т. д. Вместо полной структурной формы tuple теперь можно дать короткий описательный алиас...
- Есть ли в C# аналог инструкции With...End With?
Инструкция With...End With в VB позволяет выполнять серию операторов, которые многократно обращаются к одному объекту, используя упрощённый синтаксис доступа к его членам. Есть ли аналог в C#? Нет. Ближайший аналог - инициализаторы объектов, но они работают только при создании новых экземпляров.
2023 / 07
- C# 12 - Первичные конструкторы
Начиная с C# 12, можно объявлять первичный конструктор внутри классов и структур. Параметры размещаются в скобках сразу после имени типа. Они имеют широкую область видимости: могут инициализировать свойства или поля, использоваться как переменные в методах и локальных функциях, а также передаваться в базовый конструктор.
2023 / 06
- Как начать программировать на C#
Руководство для начинающих по началу программирования на C#: от установки Visual Studio до написания первой программы и поиска ресурсов для обучения.
- Как перейти на C# 12
Исправьте ошибки версии языка C# 12, обновив target framework до .NET 8 или указав LangVersion в файле .csproj.
- Что нового в C# 12
Обзор новых возможностей C# 12: первичные конструкторы, параметры лямбда по умолчанию, выражения коллекций, inline arrays и многое другое.
2023 / 05
- C# 12 - Значения по умолчанию для параметров в лямбда-выражениях
C# 12 позволяет задавать значения по умолчанию для параметров и массивы params в лямбда-выражениях так же, как в методах и локальных функциях.
2023 / 03
- C# 11 - Обобщённые атрибуты
Узнайте, как определять и использовать обобщённые атрибуты в C# 11, включая ограничения на аргументы типов и распространённые сообщения об ошибках.
- C# 11 - модификатор доступа file и типы с областью файла
Узнайте, как модификатор file в C# 11 ограничивает область типа файлом, в котором он объявлен, помогая избежать коллизий имён с генераторами исходного кода.
- C# 11 - Интерполированные сырые строковые литералы
Узнайте, как использовать интерполированные сырые строковые литералы в C# 11, включая экранирование фигурных скобок, использование нескольких символов $ и условные операторы.
- Сырые строковые литералы C# 11 (синтаксис тройных кавычек)
Используйте сырые строковые литералы C# 11 (синтаксис тройных кавычек `"""`) для встраивания пробелов, переводов строк и кавычек без escape-последовательностей. Правила и примеры.
- Как перейти на C# 11
Исправьте ошибку 'Feature is not available in C# 10.0', перейдя на C# 11 через target framework или LangVersion в файле .csproj.
- C# выбросить исключение при null: ArgumentNullException.ThrowIfNull (.NET 6+)
Используйте ArgumentNullException.ThrowIfNull в .NET 6+ для лаконичных проверок на null или throw-выражения в C# 7+ для более ранних фреймворков.
2020 / 11
- Получение Stream встроенного ресурса в .NET Core
Узнайте, как получить поток встроенного ресурса в .NET Core, разобравшись, как формируется имя ресурса, и используя GetManifestResourceStream.
- Как использовать appsettings.json в Xamarin.Forms
Узнайте, как использовать конфигурационные файлы appsettings.json в Xamarin.Forms, встраивая файл как ресурс и создавая объект IConfiguration.
- Как публично выставить локальный сервис SignalR для мобильных клиентов с помощью ngrok
Используйте ngrok, чтобы публично выставить ваш локальный сервис SignalR и позволить мобильным клиентам подключаться без настройки сети и обходов SSL.
2020 / 05
- C# using var (using-объявление)
Используйте using-объявления C# 8 (`using var`) для освобождения объектов IDisposable без вложенных фигурных скобок. Синтаксис, правила области видимости и когда лучше использовать блок `using`.
2020 / 04
- Присваивание с объединением null ??= в C# 8.0
Узнайте, как работает оператор присваивания с объединением null (??=) в C# 8.0, на практических примерах вроде кеширования и условного присваивания.
2019 / 01
- Анимация фона с помощью Xamarin Forms
Создайте плавный анимированный фон в Xamarin Forms с помощью анимаций ScaleTo на наложенных BoxView.
2013 / 10
- Сколько ПК нужно, чтобы досчитать до одного триллиона
Бенчмарк того, сколько времени нужно ПК, чтобы досчитать до одного триллиона и дальше, с обновлёнными результатами 2023 года.
2013 / 06
- Периодическое обновление live tiles с помощью ScheduledTaskAgent
Используйте ScheduledTaskAgent, чтобы периодически обновлять live tiles вашего Windows Phone из RSS-фида.
- Добавляем распознавание речи в приложение WP8
Добавьте распознавание речи в ваше приложение Windows Phone 8 с помощью контрола SpeechTextBox из Windows Phone toolkit.
2013 / 05
- Создаём wide tiles для приложения Windows Phone 7
Создавайте wide live tiles одновременно для Windows Phone 7 и 8 с помощью библиотеки MangoPollo и одного фрагмента кода.
2012 / 01
- C#: преобразование Hex в Color
Метод-расширение C#, преобразующий hex-коды цветов (форматы RGB и ARGB) в объекты Color.
- Повышаем продуктивность с помощью code snippets
Узнайте, как code snippets в Visual Studio помогают повысить продуктивность, позволяя вставлять переиспользуемые куски кода по короткому алиасу.