Microsoft выпустил плановый превью выпуск - Preview 5 для .NET 11 с обновлениями для .N...
Microsoft выпустил плановый превью выпуск - Preview 5 для .NET 11 с обновлениями для .NET Runtime, SDK, ASP NET Core, .NET MAUI, C#, Entity Framework Core и т.д, Полноценный релиз .NET 11 которой произойдет в ноябре. Изменений много и в основном лни мелкие. Поэтому остановлюсь только на нововведениях в C# 15, который также выйдет в полноценный релиз только в ноябре. Закрытые классы В C# 15 добавлена функциональность закрытых классов - для их объявления применяется контекстуальное слово "closed" Закрытый класс может быть напрямую унаследован только от класса в той же сборке. Компилятор может использовать известные производные типы при проверке исчерпываемости выражений switch Закрытый класс является неявно абстрактным. Прямые подтипы должны быть объявлены в той же сборке, что и закрытый базовый класс. Выражение switch над закрытым классом является исчерпывающим, если оно обрабатывает все достижимые прямые подтипы. Применение: public closed record class GateState;public record class Closed : GateState;public record class Open(float Percent) : GateState; static string Describe(GateState state) => state switch{ Closed => "closed", Open(var percent) => $"{percent}% open"}; Объединения (union) Слово "union" создает значимый тип (value type), значение которого может быть одним из фиксированного набора типов вариантов. Сопоставление с образцом раскрывает значение объединения, а выражения switch являются исчерпывающими, если они обрабатывают все типы вариантов Применение: public record class Dog(string Name);public record class Cat(int Lives); public union Pet(Dog, Cat); static string Describe(Pet pet) => pet switch{ Dog(var name) => $"dog: {name}", Cat(var lives) => $"cat: {lives}"}; Unsafe и небезопасный контекст В Preview 5 типы указателей и значения указателей теперь могут появляться вне небезопасного контекста (unsafe-контекст); граница небезопасного контекста смещается к операциям, которые разыменовывают неуправляемую память или вызывают члены, помеченные как небезопасные. int value = 42;int* pointer = &value; // указатель вне unsafe-контекста unsafe{ System.Console.WriteLine(*pointer);}Объявление указателя и выражение адреса разрешены вне небезопасного блока. Разыменование указателя по-прежнему требует небезопасного контекста. https://devblogs.microsoft.com/dotnet/dotnet-11-preview-5/