Нові можливості C# 12 preview
Visual Studio 17.7 Preview 3 та .NET 8 Preview 6 продовжують розвиток C# 12. Ця попередня версія включає функції, призначені для створення фундаменту для покращення продуктивності в майбутньому. Простий доступ до вбудованих масивів дозволить бібліотекам використовувати їх у більшій кількості програм без зайвих зусиль з вашого боку. У цій попередній версії дебютує експериментальна функція перехоплення, яка дозволяє генераторам перенаправляти код, наприклад, для забезпечення контекстно-залежної оптимізації.Нарешті, розширено можливості роботи функції nameof.
Ви можете отримати C# 12, встановивши останню попередню версію Visual Studio або останню версію .NET SDK. Щоб ознайомитися з можливостями C# 12, вам потрібно встановити мовну версію вашого проєкту на preview:
Оскільки перехоплювачі є експериментальними, вони потребують додаткового позначення у файлі проєкту.
nameof – доступ до елементів екземпляра
Відтепер ключове слово nameof працює з іменами елементів, включно з початковими значеннями, статичними елементами та атрибутами:
Ви можете дізнатися більше в статті Що нового в C# 12.
Вбудовані масиви
Атрибут InlineArrayAttribute був представлений у середовищі виконання у попередньому випуску .NET 8. Це розширена функція, яка буде використовуватися переважно компілятором, бібліотеками .NET та деякими іншими бібліотеками. Атрибут ідентифікує тип, який можна розглядати як безперервну послідовність примітивів для ефективних, безпечних за типом, захищених від перевиконання індексованих/зрізаних вбудованих даних. Бібліотеки .NET підвищують продуктивність ваших програм та інструментів, що використовують вбудовані масиви.
Компілятор створює різні IL для доступу до вбудованих масивів. Це призводить до деяких обмежень, наприклад, не підтримуються шаблони списків. У більшості випадків доступ до вбудованих масивів здійснюється так само, як і до інших масивів. Різні IL дають приріст продуктивності без зміни коду:
Більшість людей використовують вбудовані масиви, а не створюють їх. Але корисно розуміти, як це працює. Інтегровані масиви швидкі, тому що вони покладаються на точний план заданої довжини. Вбудований масив – це тип з одним полем, позначений атрибутом InlineArrayAttribute, який вказує довжину масиву. У типі, що використовувався у попередньому прикладі, завдяки параметру атрибута програма створює сховище рівно для десяти елементів у Buffer10:
Більше інформації в статті Що нового в C# 12.
Перехоплювачі
У цій версії представлено експериментальну можливість, яка називається interceptors (перехоплювачі). Вона призначена для розширених сценаріїв, зокрема для покращення випереджувальної компіляції (AOT). Як експериментальна частина .NET 8, вона може бути змінена або вилучена у майбутній версії. Таким чином, його не слід використовувати у продакшені.
Перехоплювачі дозволяють перенаправляти виклики певних методів до іншого коду. Атрибути визначають фактичне місцеперебування вихідного коду, тому перехоплювачі зазвичай підходять лише для генераторів коду. Ви можете прочитати статтю-пропозицію про перехоплювачі, щоб дізнатися більше про те, як вони працюють.
Оскільки перехоплювачі є експериментальною можливістю, вам потрібно буде явно увімкнути їх у файлі проєкту:
Перехоплювачі дозволяють створювати цікаві шаблони коду. Ось кілька прикладів:
Виклики, відомі під час компіляції, такі як Regex.IsMatch(@“a+b+”) з постійним шаблоном, можуть бути перехоплені, щоб використовувати статично згенерований код для оптимізації, сприятливої до AOT.
ASP.NET Мінімальні виклики API, такі як app.MapGet(“/products”, handler: (int? page, int? pageLength, MyDb db) => { … }) можна перехопити, щоб зареєструвати статично згенеровану thunk, яка викликає користувацький обробник напряму, минаючи виділення та індексацію.
У векторизації, де цикли foreach містять виклики користувацьких методів, компілятор може переписати код, щоб перевірити та використати відповідні властивості під час виконання, але повернутися до початкового коду, якщо ці властивості недоступні.
Статична роздільна здатність графів залежностей для впровадження залежностей, де provider.Register() може бути перехоплений.
Виклики до провайдерів запитів можна перехоплювати, щоб запропонувати переклад на іншу мову (наприклад, SQL) під час компіляції, замість того, щоб обчислювати дерева виразів для перекладу під час виконання.
Serializers (серіалізатори) можуть генерувати специфічну для типу (де)серіалізацію на основі конкретного типу викликів, таких як Serialize(), і все це під час компіляції.
Більшість програмістів не будуть використовувати перехоплювачі безпосередньо, але в будь-якому випадку вони відіграватимуть важливу роль у прагненні зробити ваші програми швидшими та простішими у розгортанні. Очікується, що перехоплювачі залишаться експериментальними у версії C# 12/.NET 8 і можуть бути включені в наступну версію C#.
Підсумок
Ви можете знайти більше інформації про всі функції, представлені на цей час, на сторінці Що нового в C# 12 в Microsoft Learn, а також відстежувати розвиток функцій C# 12 на сторінці Roslyn Feature Status.
Ви можете перевірити найновіші можливості C# 12, завантаживши останню попередню версію Visual Studio або останню версію .NET SDK і встановивши LangVersion для preview у файлі вашого проєкту.