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

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

Синтаксис

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

Remarks

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

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

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

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")>]
[<``module``:MyCustomModuleAttribute>]
do
   printfn "Executing..."

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

Хотя обычно не требуется явно указывать целевой объект атрибута, допустимые значения для целевого объекта в атрибуте вместе с примерами использования приведены в следующей таблице:

Целевой объект атрибута Пример
сборка
[<assembly: AssemblyVersion("1.0.0.0")>]
module
[<``module``: MyCustomAttributeThatWorksOnModules>]
return
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
поле
[<DefaultValue>] val mutable x: int
свойство;
[<Obsolete>] this.MyProperty = x
param
member this.MyMethod([<Out>] x : ref<int>) = x := 10
тип

[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

См. также