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

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

Синтаксис

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

Замечания

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

Имя атрибута ссылается на имя (возможно, квалифицированное с пространствами имен) допустимого типа атрибута, с суффиксом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``: MyCustomAttributeThatWorksOnModules>]
Ввод
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
field
[<DefaultValue>] val mutable x: int
свойство
[<Obsolete>] this.MyProperty = x
param
member this.MyMethod([<Out>] x : ref<int>) = x := 10
type
[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

См. также