Атрибуты (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 |