Поделиться через


Применение атрибутов

Используйте следующий процесс, чтобы применить атрибут к элементу кода.

  1. Определите новый атрибут или используйте существующий атрибут .NET.

  2. Примените атрибут к элементу кода, поместив его непосредственно перед элементом.

    Каждый язык имеет собственный синтаксис атрибута. В C++ и C#атрибут окружен квадратными скобками и отделен от элемента пробелами, которые могут включать разрыв строки. В Visual Basic атрибут окружен угловой скобкой и должен находиться в одной логической строке; символ продолжения строки можно использовать, если требуется разрыв строки.

  3. Укажите позиционные параметры и именованные параметры для атрибута.

    Позиционные параметры являются обязательными и должны поступать перед любыми именованными параметрами; они соответствуют параметрам одного из конструкторов атрибута. Именованные параметры являются необязательными и соответствуют свойствам атрибута чтения и записи. В C++ и C# укажите для каждого необязательного параметра, где — имя свойства. В Visual Basic укажите name:=value.

Атрибут помещается в метаданные при компиляции кода и доступен для общего языка выполнения (CLR) и любого пользовательского инструмента или приложения через службы отражения во время выполнения.

По соглашению все имена атрибутов заканчиваются атрибутом "Атрибут". Однако несколько языков, предназначенных для среды выполнения, например Visual Basic и C#, не требуют указания полного имени атрибута. Например, если вы хотите инициализировать объект, необходимо ссылаться на него как на Obsolete.

Допустимые аргументы атрибутов

При передаче аргументов атрибуту используйте один из следующих типов выражений:

  • Константные выражения (литералы, значения и значения перечислений).
  • Выражения типов (typeof в C#, GetType в Visual Basic).
  • Выражения имен (nameof в C#, NameOf в Visual Basic), которые создают константы строк во время компиляции.
  • Выражения создания массива типа параметра атрибута, которые используют только предыдущие выражения в качестве значений элементов.

Следующие типы допустимы в качестве типов параметров атрибута:

  • Простые типы (ключевое слово C# / ключевое слово Visual Basic / тип среды выполнения .NET):

    C# Visual Basic тип среды выполнения .NET
    bool Boolean Boolean
    byte Byte Byte
    char Char Char
    double Double Double
    float Single Single
    int Integer Int32
    long Long Int64
    short Short Int16
    string String String
  • (в C#, если значение является одним из допустимых типов аргументов атрибутов или одномерным массивом из них).

  • .

  • Типы перечислений, доступные в месте использования.

  • Одномерные массивы любого из предыдущих типов.

Замечание

Типы , , , , , , и являются недопустимыми типами параметров атрибутов, даже если они поддерживают литеральные константы.

В следующих примерах показаны допустимые аргументы атрибутов:

[MyAttr(true)]                            // bool literal
[MyAttr(42)]                              // int literal
[MyAttr("hello")]                         // string literal
[MyAttr(MyEnum.Value)]                    // enum value
[MyAttr(typeof(string))]                  // typeof expression
[MyAttr(nameof(MyClass))]                 // nameof expression (string constant)
[MyAttr(new int[] { 1, 2, 3 })]          // array of constants
[MyAttr(new string[] { "a", "b" })]      // array of strings
<MyAttr(True)>                            ' Boolean literal
<MyAttr(42)>                              ' Integer literal
<MyAttr("hello")>                         ' String literal
<MyAttr(MyEnum.Value)>                    ' Enum value
<MyAttr(GetType(String))>                 ' GetType expression
<MyAttr(NameOf(MyClass))>                 ' NameOf expression (string constant)
<MyAttr(New Integer() {1, 2, 3})>         ' Array of constants

В следующих примерах показаны аргументы, вызывающие ошибку компилятора:

string value = "test";
[MyAttr(value)]        // Error CS0182: not a constant expression
[MyAttr(GetValue())]   // Error CS0182: method calls aren't allowed

Применение атрибута к методу

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

public class Example
{
    // Specify attributes between square brackets in C#.
    // This attribute is applied only to the Add method.
    [Obsolete("Will be removed in next version.")]
    public static int Add(int a, int b)
    {
        return (a + b);
    }
}

class Test
{
    public static void Main()
    {
        // This generates a compile-time warning.
        int i = Example.Add(2, 2);
    }
}
Public Class Example
    ' Specify attributes between square brackets in C#.
    ' This attribute is applied only to the Add method.
    <Obsolete("Will be removed in next version.")>
    Public Shared Function Add(a As Integer, b As Integer) As Integer
        Return a + b
    End Function
End Class

Class Test
    Public Shared Sub Main()
        ' This generates a compile-time warning.
        Dim i As Integer = Example.Add(2, 2)
    End Sub
End Class

Применение атрибутов на уровне сборки

Если вы хотите применить атрибут на уровне сборки, используйте ключевое слово assembly (Assembly в Visual Basic). В следующем коде показано, как это применяется на уровне сборки.

using System.Reflection;
[assembly:AssemblyTitle("My Assembly")]
Imports System.Reflection
<Assembly: AssemblyTitle("My Assembly")>

При применении этого атрибута строка помещается в манифест сборки в части метаданных файла. Атрибут можно просмотреть с помощью il Disassembler (Ildasm.exe) или путем создания пользовательской программы для получения атрибута.

См. также

  • Атрибуты
  • Извлечение сведений, хранящихся в атрибутах
  • Основные понятия
  • Атрибуты (C#)
  • Обзор атрибутов (Visual Basic)