Attribute (F#)

Mit Attributen können Metadaten auf ein Programmierungskonstrukt angewendet werden.

Syntax

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

Bemerkungen

In der vorherigen Syntax ist target optional und gibt, falls vorhanden, die Art der Programmentität an, für die das Attribut gilt. Gültige Werte für target werden in der Tabelle weiter unten in diesem Dokument aufgeführt.

attribute-name bezieht sich 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 der Typ ObsoleteAttribute in diesem Kontext auf Obsolete gekürzt werden.

Für arguments werden die Argumente für den Konstruktor des Attributtyps eingefügt. Wenn ein Attribut über einen parameterlosen Konstruktor verfügt, können die Argumentliste und die Klammern weggelassen werden. Attribute unterstützen sowohl positionelle Argumente als auch benannte Argumente. Positionelle Argumente sind Argumente, die in der Reihenfolge verwendet werden, in der sie aufgeführt sind. Benannte Argumente können verwendet werden, wenn das Attribut über öffentliche Eigenschaften verfügt. Sie können diese festlegen, indem Sie die folgende Syntax in der Argumentliste verwenden.

property-name = property-value

Solche Eigenschafteninitialisierungen können in beliebiger Reihenfolge erfolgen, jedoch immer nach positionellen Argumenten. Im Folgenden finden Sie ein Beispiel für ein Attribut, das positionelle Argumente und Eigenschafteninitialisierungen verwendet:

open System.Runtime.InteropServices

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

In diesem Beispiel lautet das Attribut DllImportAttribute. Hier wird es in verkürzter Form verwendet. Das erste Argument ist ein positioneller Parameter und das zweite eine Eigenschaft.

Attribute sind ein .NET-Programmierkonstrukt, durch das ein Objekt, das als Attribut bezeichnet wird, einem Typ oder einem anderen Programmelement zugeordnet werden kann. Das Programmelement, auf das ein Attribut angewendet wird, wird als Attributziel bezeichnet. Das Attribut enthält in der Regel Metadaten zu seinem Ziel. In diesem Kontext können Metadaten beliebige Daten über den Typ sein, außer seine Felder und Member.

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

In der Regel erfolgt 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 Attribute zur Laufzeit abfragen, indem Sie die .NET-Reflexion verwenden.

Sie können mehrere Attribute einzeln deklarieren, wie im vorherigen Codebeispiel, oder innerhalb eines Klammernpaars, wenn Sie ein Semikolon verwenden, um die einzelnen Attribute und Konstruktoren wie folgt zu trennen:

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

Zu den typischen Attributen gehören das Obsolete-Attribut, Attribute für Sicherheitsvorkehrungen, Attribute für COM-Unterstützung, Attribute für den Codebesitz, und Attribute, die angeben, ob ein Typ serialisiert werden kann. Im folgenden Beispiel wird die Verwendung des Obsolete-Attributs veranschaulicht.

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 die erste do-Bindung in Ihrer 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")>]
[<``module``:MyCustomModuleAttribute>]
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 System.AttributeUsageAttribute, das Informationen zu den möglichen Zielen enthält, die für dieses Attribut unterstützt werden. Wenn System.AttributeUsageAttribute angibt, dass das Attribut Funktionen als Ziele unterstützt, wird das Attribut verwendet, um es auf den Haupteinstiegspunkt des Programms anzuwenden. Wenn System.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 für Funktionen und Assemblys, aber wenn das der Fall ist, wird das Attribut auf die main-Funktion des Programms angewendet. Wenn das Attributziel explizit angegeben wird, wird das Attribut auf das angegebene Ziel angewendet.

Obwohl Sie das Attributziel in der Regel nicht explizit angeben müssen, werden in der folgenden Tabelle gültige Werte für target in einem Attribut zusammen mit Beispielen für die Verwendung aufgeführt:

Attributziel Beispiel
Assembly
[<assembly: AssemblyVersion("1.0.0.0")>]
module
[<``module``: MyCustomAttributeThatWorksOnModules>]
return
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
Feld
[<DefaultValue>] val mutable x: int
property
[<Obsolete>] this.MyProperty = x
Parameter
member this.MyMethod([<Out>] x : ref<int>) = x := 10
type
[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

Weitere Informationen