Freigeben über


Attribute (F#)

Attribute ermöglichen das Anwenden von Metadaten auf ein Programmierkonstrukt.

Syntax

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

Hinweise

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 das -Ziel werden in der Tabelle dargestellt, die später in diesem Dokument erscheint.

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 nur 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 Klammern weggelassen werden. Attribute unterstützen sowohl Positionsargumente als auch benannte Argumente. Positionalargumente sind Argumente, die in der Reihenfolge verwendet werden, in der sie angezeigt werden. Benannte Argumente können verwendet werden, wenn das Attribut öffentliche Eigenschaften aufweist. Sie können diese festlegen, indem Sie die folgende Syntax in der Argumentliste verwenden.

property-name = property-value

Solche Eigenschaftsinitialisierungen können in beliebiger Reihenfolge erfolgen, müssen jedoch allen Positionsargumenten entsprechen. Im Folgenden sehen Sie ein Beispiel für ein Attribut, das Positionsargumente und Eigenschaftsinitialisierungen 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 Positionsparameter und der zweite ist eine Eigenschaft.

Attribute sind ein .NET-Programmierkonstrukt, das es ermöglicht, ein als Attribut bekanntes Objekt einem Typ oder einem anderen Programmelement zuzuordnen. Das Programmelement, auf das ein Attribut angewendet wird, wird als Attributzielbezeichnet. Das Attribut enthält in der Regel Metadaten zu seinem Ziel. In diesem Zusammenhang könnten Metadaten alle Daten über den Typ außer seinen Feldern und Mitgliedern sein.

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

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

[<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 Sie können sie in einer Reihe von Klammern deklarieren, wenn Sie ein Semikolon verwenden, um die einzelnen Attribute und Konstruktoren wie folgt zu trennen:

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

In der Regel trifft man auf Attribute wie das Attribut Obsolete, Attribute für Sicherheitsüberlegungen, Attribute für COM-Unterstützung, Attribute, die den Besitz von Code betreffen, und Attribute, die angeben, ob ein Typ serialisiert werden kann. Im folgenden Beispiel wird die Verwendung des attributs Obsolete 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`` in die Attributdeklaration wie folgt einfügen:

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 ermitteln, das für dieses Attribut sinnvoll ist. Viele Attributklassen weisen ein Attribut vom Typ System.AttributeUsageAttribute auf, 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 in Fällen, in denen sie dies tun, wird das Attribut verwendet, um auf die Hauptfunktion des Programms anzuwenden. 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 gültige Werte für Ziel- in einem Attribut zusammen mit Beispielen für die Verwendung in der folgenden Tabelle gezeigt:

Attributziel Beispiel
Assembly
[<assembly: AssemblyVersion("1.0.0.0")>]
module
[<``module``: MyCustomAttributeThatWorksOnModules>]
Methode
[<MyCustomAttributeThatWorksOnMethods>]
let someFunction() = 42
class
[<MyCustomAttributeThatWorksOnClasses>]
type MyClass(myValue: int) =
    member _.MyValue = myValue
struct
[<MyCustomAttributeThatWorksOnStructs>]
[<Struct>]
type MyStruct(myValue: int) =
    member _.MyValue = myValue
Schnittstelle
[<MyCustomAttributeThatWorksOnInterfaces>]
type MyInterface =
    abstract member Prop: string
enum
[<MyCustomAttributeThatWorksOnEnums>]
type Color =
    | Red = 0
    | Green = 1
    | Blue = 2
Konstruktor
type MyClass(myValue: int) =
    member _.MyValue = myValue

    [<MyCustomAttributeThatWorksOnCtors>]
    new () = MyClass 42
return
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
Feld
[<DefaultValue>] val mutable x: int
property
[<Obsolete>] this.MyProperty = x
param
member this.MyMethod([<Out>] x : ref<int>) = x := 10
Typ
[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

Weitere Informationen