Применение атрибутов
Обновлен: Ноябрь 2007
Для применения атрибутов необходимо добавлять блоки атрибутов к таким элементам программы, как свойства, методы, события, классы и сборки. Блок атрибута состоит из угловых скобок (< >), в которые заключен список объявлений атрибутов, разделенных запятыми. Объявление атрибута состоит из необязательных модификаторов атрибута, например Module или Assembly, имени атрибута, списка необходимых позиционных параметров (возможно, перегруженного) и списка дополнительных именованных аргументов. Атрибуты с модификаторами должны размещаться в начале исходного файла в разделе атрибутов. Например, следующий код назначает атрибуты сборке и модулю. Сборке назначается атрибут, который определяет ее заголовок, а модулю — атрибут, который указывает, что данный модуль совместим с общеязыковой спецификацией (CLS):
Imports System.Reflection
<Assembly: AssemblyTitleAttribute("Production assembly 4"), _
Module: CLSCompliant(True)>
Атрибуты сборки могут также назначаться в файле AssemblyInfo.vb, который автоматически добавляется к проектам интерфейсом пользователя Visual Studio. Этот файл содержит атрибуты уровня сборки, имеющие либо значения по умолчанию, либо пустые значения.
При применении к программным элементам, например свойствам, атрибуты предшествуют элементу. Например, следующий код применяет атрибут к определению класса:
<CustomAttr(Update:=True)> Class Class1
Чтобы отличать атрибуты от других элементов .NET Framework, принято, чтобы все имена атрибутов заканчивались словом "Attribute". Однако нет необходимости определять суффикс атрибута при его использовании. Например, если имеется атрибут с именем CustomAttrAttribute, определение <CustomAttr(Update:=True)> эквивалентно <CustomAttrAttribute(Update:=True)>.
Аргументы атрибутов
Атрибуты используют необязательные, обязательные, позиционные и именованные аргументы фактически таким же образом, как объекты используют эти типы аргументов. Позиционные аргументы — это аргументы, которые определяются в том порядке, в котором они объявлены в конструкторе атрибута. Например, следующий код вызывает конструктор Sub New для атрибута с двумя значениями:
<CustomAttr(True, False)> Class Class1
Аргументы, передаваемые конструктору Sub New в классах атрибутов, часто используются для инициализации значений полей и свойств.
Для прямого присвоения значений свойствам и полям можно использовать именованные аргументы. Они определяются добавлением ":=" к имени аргумента, за которым следует присваиваемое значение. В отличие от позиционных аргументов, именованные аргументы могут задаваться в любом порядке. Например, следующий код устанавливает значение True для поля Update и False для поля Keep:
<CustomAttr(Update:=True, Keep:=False)> Class Class1
Примечание. |
---|
Аргументы атрибутов имеют одно важное отличие от аргументов, использующихся при стандартном вызове методов. В качестве аргументов для конструктора Sub New классов атрибутов следует использовать позиционные аргументы. Именованные аргументы могут использоваться только для присвоения значений полям и свойствам классов атрибутов. |
Обязательные аргументы — это те аргументы, которые должны определяться всегда. Необязательные аргументы — это такие аргументы, задавать которые необязательно. Их можно либо заменить запятой (в случае использования позиционных аргументов), либо просто пропустить (при использовании именованных аргументов).
Аргументы атрибутов должны быть константными выражениями.
Примеры атрибутов
В следующих примерах содержатся примеры объявления атрибутов.
Использование атрибутов MarshalAs для управления маршалинга параметров
Добавьте оператор Imports для пространства имен System.Runtime.InteropServices в начало исходного кода:
Imports System.Runtime.InteropServices
Разместите в начале списка параметров атрибут MarshalAsAttribute и задайте необходимый тип данных. Например, следующий код маршалирует два параметра как указатели типа данных long в строку (LPStr) для функции Windows API:
Declare Auto Sub CopyFile Lib "Kernel32.Lib" ( _ <MarshalAs(UnmanagedType.LPWStr)> ByVal existingfile As String, _ <MarshalAs(UnmanagedType.LPWStr)> ByVal newfile As String, _ ByVal failifexists As Boolean _ )
Общеязыковая среда выполнения использует атрибут MarshalAsAttribute для определения способа маршалинга параметра между управляемым кодом Visual Basic и неуправляемым кодом в вызов Windows API.
Предоставление метода удаленному веб-клиенту
В меню Файл нажмите кнопку Проект, выберите шаблон Веб-служба ASP.NET и добавьте оператор Imports для пространства имен System.Web:
Imports System.Web.Services
Определите метод и используйте атрибут WebMethodAttribute для того, чтобы сделать этот метод доступным для удаленных веб-клиентов:
<WebMethod()> Public Function HelloWorld() As String HelloWorld = "Hello World..." End Function
Для предоставления метода веб-клиентам недостаточно применить к методу веб-службы XML-модификатор Public. Перед тем как удаленный веб-клиент сможет вызвать данный метод, к методу должен быть явно добавлен атрибут WebMethodAttribute.
См. также
Задачи
Практическое руководство. Определение пользовательских атрибутов
Основные понятия
Общие сведения об атрибутах в Visual Basic
Общие случаи использования атрибутов
Передача аргумента по позиции и по имени
Ссылки
Оператор Imports (пространство имен .NET и тип)