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


Атрибуты (F#)

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

[<target:attribute-name(arguments)>]

Заметки

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

attribute-name — это имя (возможно, дополненное пространствами имен) допустимого типа атрибута с суффиксом Attribute или без этого суффикса, который обычно используется в именах типов атрибутов. Например, тип ObsoleteAttribute может быть сокращен до Obsolete в этом контексте.

arguments — это аргументы, передаваемые конструктору для данного типа атрибута. Если для атрибута имеется конструктор по умолчанию, список аргументов и круглые скобки можно опустить. Атрибуты поддерживают как позиционные, так и именованные аргументы. Позиционные аргументы — это аргументы, которые используются в том порядке, в котором они расположены. Именованные аргументы могут использоваться, если атрибут имеет открытые свойства. Такие свойства можно задать, используя следующий синтаксис в списке аргументов.

property-name = property-value

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

open System.Runtime.InteropServices

[<DllImport("kernel32", SetLastError=true)>]
extern bool CloseHandle(nativeint handle)

Атрибут в этом примере — DllImportAttribute. Он здесь используется в сокращенной форме. Первым аргументом является позиционный параметр, а вторым — свойство.

Атрибуты представляют собой конструкцию программирования .NET, которая позволяет связать объект, называемый атрибутом, с типом или другим элементом программы. Элемент программы, к которому применяется атрибут, называется целевым объектом атрибута. Атрибут обычно содержит метаданные о своем целевом объекте. В этом контексте метаданными могут быть любые данные о типе, отличные от его полей и членов.

Атрибуты в языке F# могут применяться к следующим конструкциям программирования: функциям, методам, сборкам, модулям, типам (классам, записям, структурам, интерфейсам, делегатам, перечислениям, объединениям и т. д.), конструкторам, свойствам, полям, параметрам, параметрам типа и возвращаемым значениям. Атрибуты не допускаются в привязках let внутри классов, выражений и выражений рабочих процессов.

Обычно объявление атрибута находится непосредственно перед объявлением целевого объекта атрибута. Несколько объявлений атрибутов можно использовать вместе, как показано ниже.

[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =

Атрибуты можно запрашивать во время выполнения, используя отражение .NET.

Несколько атрибутов можно объявить по отдельности, как в предыдущем примере кода, или в одном наборе скобок, если для разделения отдельных атрибутов и конструкторов используется точка с запятой, как показано ниже.

[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =

Обычно встречаются следующие атрибуты: атрибут Obsolete, атрибуты для обеспечения безопасности, атрибуты для поддержки модели COM, атрибуты, относящиеся к владению кодом, и атрибуты, указывающие, может ли быть сериализован тип. В следующем примере показано использование атрибута Obsolete.

open System

[<Obsolete("Do not use. Use newFunction instead.")>]
let obsoleteFunction x y =
  x + y

let newFunction x y =
  x + 2 * y

// The use of the obsolete function produces a warning.
let result1 = obsoleteFunction 10 100
let result2 = newFunction 10 100

Для целевых объектов атрибутов assembly и module атрибуты применяются к привязке do верхнего уровня в сборке. В объявление атрибута можно включить слово assembly или module, как показано ниже.

open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
do
   printfn "Executing..."

Если целевой объект для атрибута, примененного к привязке do, опущен, компилятор F# пытается определить целевой объект атрибута, который имеет смысл для этого атрибута. Многие классы атрибутов имеют атрибут типа AttributeUsageAttribute, который содержит информацию о возможных целевых объектах, поддерживаемых для этого атрибута. Если значение AttributeUsageAttribute указывает, что атрибут поддерживает функции в качестве целевых объектов, этот атрибут выбирается для применения к основной точке входа программы. Если значение AttributeUsageAttribute указывает, что атрибут поддерживает сборки в качестве целевых объектов, компилятор выбирает этот атрибут, чтобы применить к сборке. Большинство атрибутов не применяются и к функциям, и к сборкам, но в тех случаях, когда это делается, атрибут выбирается для применения к основной функции программы. Если целевой объект атрибута указан явно, атрибут применяется к указанному целевому объекту.

Хотя обычно явно указывать целевой объект атрибута не требуется, в представленной ниже таблице приведены допустимые значения параметра target в атрибуте наряду с примерами использования.

Целевой объект атрибута

Пример

сборка

[<assembly: AssemblyVersionAttribute("1.0.0.0")>]

return

let function1 x : [<return: Obsolete>] int = x + 1

поле

[<field: DefaultValue>] val mutable x: int

Свойство

[<property: Obsolete>] this.MyProperty = x

param

member this.MyMethod([<param: Out>] x : ref<int>) = x := 10

type

[<type: StructLayout(Sequential)>]

type MyStruct =

struct

x : byte

y : int

end

См. также

Другие ресурсы

Справочник по языку F#