Attribute (F#)

Attribute ermöglichen die Anwendung von Metadaten auf ein Programmierkonstrukt.

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

Hinweise

In der vorherigen Syntax ist das target optional. Falls vorhanden, gibt es die Art der Programmentität an, auf die das Attribut angewendet wird. Gültige Werte für target werden in der Tabelle weiter unten in diesem Dokument angegeben.

Der attribute-name verweist auf den Namen (möglicherweise mit Namespaces qualifiziert) eines gültigen Attributtyps, mit oder ohne das Suffix Attribute, das normalerweise in Attributtypnamen verwendet wird. Beispielsweise kann für den Typ ObsoleteAttribute in diesem Kontext die kürzere Bezeichnung Obsolete verwendet werden.

Die arguments sind die Argumente für den Konstruktor des Attributtyps. Wenn ein Attribut über einen Standardkonstruktor verfügt, können die Argumentliste und die Klammern weggelassen werden. Attribute unterstützen sowohl Positionsargumente als auch benannte Argumente. Positionsargumente sind Argumente, die in der Reihenfolge verwendet werden, in der sie angegeben werden. Benannte Argumente können verwendet werden, wenn das Attribut über öffentliche Eigenschaften verfügt. Sie können diese mit der folgenden Syntax in der Argumentliste festlegen.

property-name = property-value

Solche Eigenschafteninitialisierungen können eine beliebige Reihenfolge aufweisen, sie müssen jedoch nach ggf. vorhandenen Positionsargumenten angegeben werden. Das folgende Beispiel veranschaulicht ein Attribut, für das Positionsargumente und Eigenschafteninitialisierungen verwendet werden.

open System.Runtime.InteropServices

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

In diesem Beispiel handelt es sich um das Attribut DllImportAttribute in der Kurzform. Das erste Argument ist ein Positionsparameter, und das zweite Argument ist eine Eigenschaft.

Attribute sind ein .NET-Programmierungskonstrukt, das die Zuordnung eines als Attribut bezeichneten Objekts zu einem Typ oder einem anderen Programmelement ermöglicht. Das Programmelement, auf das ein Attribut angewendet wird, wird als Attributziel bezeichnet. Das Attribut enthält normalerweise Metadaten zum Ziel des Attributs. In diesem Kontext können Metadaten beliebige Daten zu dem Typ sein, mit Ausnahme von dessen Feldern und Membern.

Attribute in F# können auf die folgenden Programmierungskonstrukte angewendet werden: Funktionen, Methoden, Assemblys, Module, Typen (Klassen, Datensätze, Strukturen, Schnittstellen, Delegaten, Enumerationen, Unions usw.), Konstruktoren, Eigenschaften, Felder, Parameter, Typparameter und Rückgabewerte. Attribute sind in let-Bindungen innerhalb von Klassen, Ausdrücken oder Workflowausdrücken nicht zulässig.

In der Regel befindet sich die Attributdeklaration direkt vor der Deklaration des Attributziels. Mehrere Attributdeklarationen können wie folgt zusammen verwendet werden.

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

Sie können zur Laufzeit Attribute mithilfe von .NET-Reflektion abfragen.

Sie können wie im vorherigen Codebeispiel mehrere Attribute einzeln deklarieren, oder Sie können sie, wie hier gezeigt, in einem Satz von Klammern deklarieren, wenn Sie die einzelnen Attribute und Konstruktoren mit Semikolons trennen.

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

Häufig vorhandene Attribute sind das Obsolete-Attribut, Attribute für Sicherheitsüberlegungen, Attribute für COM-Unterstützung, Attribute, die sich auf den Besitz von Code beziehen, und Attribute, die angeben, ob ein Typ serialisiert werden kann. Das folgende Beispiel veranschaulicht die Verwendung des Obsolete-Attributs.

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

Für die Attributziele assembly und module wenden Sie die Attribute auf eine do-Bindung der obersten Ebene in der Assembly an. Sie können das Wort assembly oder module wie folgt in die Attributdeklaration einschließen.

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

Wenn Sie das Attributziel für ein Attribut weglassen, das auf eine do-Bindung angewendet wird, versucht der F#-Compiler, das Attributziel zu bestimmen, das für dieses Attribut sinnvoll ist. Viele Attributklassen verfügen über ein Attribut vom Typ AttributeUsageAttribute, das Informationen zu den möglichen Zielen enthält, die für dieses Attribut unterstützt werden. Wenn das AttributeUsageAttribute angibt, dass das Attribut Funktionen als Ziele unterstützt, wird das Attribut verwendet, um es auf den Haupteinstiegspunkt des Programms anzuwenden. Wenn das AttributeUsageAttribute angibt, dass das Attribut Assemblys als Ziele unterstützt, verwendet der Compiler das Attribut, um es auf die Assembly anzuwenden. Die meisten Attribute gelten nicht sowohl für Funktionen als auch für Assemblys, wenn sie jedoch für Funktionen und Assemblys gelten, wird das Attribut auf die Hauptfunktion des Programms angewendet. Wenn das Attributziel explizit angegeben wird, wird das Attribut auf das angegebene Ziel angewendet.

Obwohl Sie normalerweise das Attributziel nicht explizit angeben müssen, werden in der folgenden Tabelle gültige Werte für target in einem Attribut zusammen mit Verwendungsbeispielen aufgeführt.

Attributziel

Beispiel

assembly

[<assembly: AssemblyVersionAttribute("1.0.0.0")>]

return

let function1 x : [<return: Obsolete>] int = x + 1

Feld

[<field: DefaultValue>] val mutable x: int

-Eigenschaft

[<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

Siehe auch

Weitere Ressourcen

F#-Sprachreferenz