Atrybuty (F#)

Atrybuty umożliwiają stosowanie metadanych do konstrukcji programowania.

Składnia

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

Uwagi

W poprzedniej składni element docelowy jest opcjonalny i, jeśli istnieje, określa rodzaj jednostki programowej, do którego ma zastosowanie atrybut. Prawidłowe wartości elementu docelowego są wyświetlane w tabeli, która zostanie wyświetlona w dalszej części tego dokumentu.

Nazwa-atrybutu odnosi się do nazwy (ewentualnie kwalifikowanej z przestrzeniami nazw) prawidłowego typu atrybutu z sufiksem lub bez sufiksuAttribute, który jest zwykle używany w nazwach typów atrybutów. Na przykład typ ObsoleteAttribute można skrócić do tylko Obsolete w tym kontekście.

Argumenty są argumentami konstruktora dla typu atrybutu. Jeśli atrybut ma konstruktor bez parametrów, można pominąć listę argumentów i nawiasy. Atrybuty obsługują zarówno argumenty pozycyjne, jak i argumenty nazwane. Argumenty pozycyjne to argumenty używane w kolejności ich wyświetlania. Argumenty nazwane mogą być używane, jeśli atrybut ma właściwości publiczne. Można je ustawić przy użyciu następującej składni na liście argumentów.

property-name = property-value

Takie inicjowanie właściwości może być w dowolnej kolejności, ale muszą być zgodne z dowolnymi argumentami pozycyjnymi. Poniżej przedstawiono przykład atrybutu, który używa argumentów pozycyjnych i inicjowania właściwości:

open System.Runtime.InteropServices

[<DllImport("kernel32", SetLastError=true)>]
extern bool CloseHandle(nativeint handle)

W tym przykładzie atrybut to DllImportAttribute, używany tutaj w skróconej postaci. Pierwszy argument jest parametrem pozycyjnym, a drugi jest właściwością.

Atrybuty to konstrukcja programowania .NET, która umożliwia skojarzenie obiektu znanego jako atrybut z typem lub innym elementem programu. Element programu, do którego jest stosowany atrybut, jest znany jako element docelowy atrybutu. Atrybut zwykle zawiera metadane dotyczące jego obiektu docelowego. W tym kontekście metadane mogą być danymi o typie innym niż jego pola i elementy członkowskie.

Atrybuty w języku F# można stosować do następujących konstrukcji programowania: funkcje, metody, zestawy, moduły, typy (klasy, rekordy, struktury, interfejsy, delegaty, wyliczenia, unii itd.), konstruktory, właściwości, pola, parametry, parametry typu i zwracane wartości. Atrybuty nie są dozwolone w let powiązaniach wewnątrz klas, wyrażeń lub wyrażeń przepływu pracy.

Zazwyczaj deklaracja atrybutu pojawia się bezpośrednio przed deklaracją obiektu docelowego atrybutu. Wiele deklaracji atrybutów można używać razem w następujący sposób:

[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =

Atrybuty można wykonywać w czasie wykonywania przy użyciu odbicia platformy .NET.

Można zadeklarować pojedynczo wiele atrybutów, tak jak w poprzednim przykładzie kodu, lub zadeklarować je w jednym zestawie nawiasów, jeśli używasz średnika, aby oddzielić poszczególne atrybuty i konstruktory w następujący sposób:

[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =

Zazwyczaj napotkane atrybuty obejmują Obsolete atrybut, atrybuty dla zagadnień dotyczących zabezpieczeń, atrybuty obsługi modelu COM, atrybuty związane z własnością kodu i atrybuty wskazujące, czy typ może być serializowany. W poniższym przykładzie pokazano użycie atrybutu 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

W przypadku obiektów docelowych assembly atrybutów i module, atrybuty są stosowane do powiązania najwyższego poziomu do w zestawie. Możesz dołączyć wyraz assembly lub ``module`` w deklaracji atrybutu w następujący sposób:

open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
[<``module``:MyCustomModuleAttribute>]
do
   printfn "Executing..."

Jeśli pominięto element docelowy atrybutu dla atrybutu zastosowanego do do powiązania, kompilator języka F# próbuje określić cel atrybutu, który ma sens dla tego atrybutu. Wiele klas atrybutów ma atrybut typu System.AttributeUsageAttribute , który zawiera informacje o możliwych miejscach docelowych obsługiwanych dla tego atrybutu. System.AttributeUsageAttribute Jeśli atrybut wskazuje, że atrybut obsługuje funkcje jako obiekty docelowe, atrybut jest pobierany do zastosowania do głównego punktu wejścia programu. System.AttributeUsageAttribute Jeśli atrybut wskazuje, że atrybut obsługuje zestawy jako obiekty docelowe, kompilator przyjmuje atrybut do zastosowania do zestawu. Większość atrybutów nie ma zastosowania zarówno do funkcji, jak i zestawów, ale w przypadkach, w których to robią, atrybut jest pobierany do zastosowania do funkcji głównej programu. Jeśli element docelowy atrybutu jest określony jawnie, atrybut jest stosowany do określonego obiektu docelowego.

Chociaż zazwyczaj nie trzeba jawnie określać obiektu docelowego atrybutu, prawidłowe wartości dla obiektu docelowego w atrybucie wraz z przykładami użycia są wyświetlane w poniższej tabeli:

Obiekt docelowy atrybutu Przykład
zestaw
[<assembly: AssemblyVersion("1.0.0.0")>]
moduł
[<``module``: MyCustomAttributeThatWorksOnModules>]
return
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
pole
[<DefaultValue>] val mutable x: int
właściwość
[<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

Zobacz też