Start Debugging
2023-10-29 Обновлено 2023-11-01 csharpdotnetdotnet-8 Edit on GitHub

C# Как помечать функциональность как экспериментальную

Начиная с C# 12, новый ExperimentalAttribute позволяет помечать типы, методы, свойства или сборки как экспериментальные. Узнайте, как использовать его с diagnosticId, pragma-тегами и UrlFormat.

Начиная с C# 12 добавлен новый атрибут ExperimentalAttribute, который позволяет помечать типы, методы, свойства или сборки как экспериментальные возможности. При использовании это будет вызывать предупреждение компилятора, которое можно подавить с помощью тега #pragma.

Атрибут Experimental требует, чтобы в конструктор передавался параметр diagnosticId. Этот идентификатор диагностики станет частью сообщения компилятора, которое генерируется при каждом использовании экспериментальной возможности. Замечание: при желании вы можете использовать один и тот же diagnostic-id в нескольких атрибутах.

Важно отметить: не используйте в diagnosticId дефисы (-) или другие специальные символы, так как это может сломать синтаксис #pragma и не позволит пользователям отключить предупреждение. Например, использование BAR-001 в качестве diagnostic id не позволит подавить предупреждение и вызовет предупреждение компилятора в самом pragma-теге.

CS1696 Single-line comment or end-of-line expected.

В атрибуте также можно указать UrlFormat, чтобы направить разработчиков к документации, связанной с экспериментальной функциональностью. Можно указать абсолютный URL, например https://acme.com/warnings/BAR001, или универсальный URL с подстановкой (https://acme.com/warnings/{0}) и позволить фреймворку сделать остальное.

Посмотрим на примеры.

Помечаем метод как экспериментальный

using System.Diagnostics.CodeAnalysis;

[Experimental("BAR001")]
void Foo() { }

Вы просто помечаете метод атрибутом Experimental и передаёте ему diagnosticId. При вызове Foo() будет сгенерировано следующее предупреждение компилятора:

BAR001 ‘Foo()’ is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.

Это предупреждение можно обойти с помощью pragma-тегов:

#pragma warning disable BAR001
Foo();
#pragma warning restore BAR001

Указание ссылки на документацию

Как упоминалось выше, ссылку на документацию можно задать через свойство UrlFormat атрибута. Это полностью необязательно.

[Experimental("BAR001", UrlFormat = "https://acme.com/warnings/{0}")]
void Foo() { }

После этого клик по кодам ошибок в Visual Studio будет открывать указанную страницу документации. Кроме того, URL добавится и в само сообщение об ошибке:

BAR001 ‘Foo()’ is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. (https://acme.com/warnings/BAR001)

Другие места применения

Атрибут можно применять практически где угодно: к сборкам, модулям, классам, структурам, перечислениям, свойствам, полям, событиям и так далее. Полный список разрешённых мест применения можно увидеть в самом определении:

[AttributeUsage(AttributeTargets.Assembly |
                AttributeTargets.Module |
                AttributeTargets.Class |
                AttributeTargets.Struct |
                AttributeTargets.Enum |
                AttributeTargets.Constructor |
                AttributeTargets.Method |
                AttributeTargets.Property |
                AttributeTargets.Field |
                AttributeTargets.Event |
                AttributeTargets.Interface |
                AttributeTargets.Delegate, Inherited = false)]
public sealed class ExperimentalAttribute : Attribute { ... }

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад