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


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