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