Атрибуты (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
Если атрибут поддерживает сборки в качестве целевых объектов, компилятор принимает атрибут для применения к сборке. Большинство атрибутов не применяются как к функциям, так и к сборкам, но в случаях, когда они делают, атрибут применяется к основной функции программы. Если целевой объект атрибута указан явно, атрибут применяется к указанному целевому объекту.
Хотя обычно не требуется явно указывать целевой объект атрибута, допустимые значения для целевого объекта в атрибуте вместе с примерами использования отображаются в следующей таблице:
Целевой объект атрибута | Пример |
---|---|
сборка |
|
модуль |
|
Ввод |
|
field |
|
свойство |
|
param |
|
type |
|