Megosztás a következőn keresztül:


Attribútumok (F#)

Az attribútumok lehetővé teszik a metaadatok programozási szerkezetre való alkalmazását.

Szintaxis

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

Megjegyzések

Az előző szintaxisban a cél megadása nem kötelező, és ha van ilyen, meghatározza, hogy az attribútum milyen típusú programentitásra vonatkozik. A cél érvényes értékei megjelennek a dokumentum későbbi részében megjelenő táblázatban.

Az attribútumnév egy érvényes attribútumtípus nevére hivatkozik (esetleg névtérrel van minősítve), az attribútumtípusnevekben általában használt Attribute utótaggal vagy anélkül. A ObsoleteAttribute típus például lerövidíthető úgy, hogy az csak Obsolete legyen ebben a környezetben.

A argumentumok az attribútumtípus konstruktorának argumentumai. Ha egy attribútum paraméter nélküli konstruktorsal rendelkezik, az argumentumlista és a zárójel kihagyható. Az attribútumok a pozícióargumentumokat és az elnevezett argumentumokat egyaránt támogatják. pozícióargumentumok olyan argumentumok, amelyek abban a sorrendben vannak használva, amelyben azok megjelennek. Az elnevezett argumentumok akkor használhatók, ha az attribútum nyilvános tulajdonságokkal rendelkezik. Ezeket az alábbi szintaxissal állíthatja be az argumentumlistában.

property-name = property-value

Az ilyen tulajdonság inicializálásai bármilyen sorrendben lehetnek, de minden pozícióargumentumot követniük kell. Az alábbi példa egy pozícióargumentumokat és tulajdonság inicializációkat használó attribútumra mutat be:

open System.Runtime.InteropServices

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

Ebben a példában az attribútum DllImportAttribute, itt rövidített formában használatos. Az első argumentum egy pozícióparaméter, a második pedig egy tulajdonság.

Az attribútumok .NET-programozási szerkezetek, amelyek lehetővé teszik, hogy egy attribútumként ismert objektumot társítani egy típushoz vagy más programelemhez. Az a programelem, amelyre egy attribútum vonatkozik, az ismert mint az attribútum célpontja. Az attribútum általában metaadatokat tartalmaz a célról. Ebben az összefüggésben a metaadatok a mezőkön és a tagokon kívül más típusú adatok is lehetnek.

Az F# attribútumai a következő programozási szerkezetekre alkalmazhatók: függvények, metódusok, szerelvények, modulok, típusok (osztályok, rekordok, struktúrák, interfészek, meghatalmazottak, enumerálások, egyesítések stb.), konstruktorok, tulajdonságok, mezők, paraméterek, típusparaméterek és visszatérési értékek. Az attribútumok nem engedélyezettek a let kötéseknél osztályokon belül, kifejezéseknél vagy munkafolyamat-kifejezéseknél.

Az attribútumdeklaráció általában közvetlenül az attribútumcél deklarációja előtt jelenik meg. Több attribútumdeklaráció is használható együtt, az alábbiak szerint:

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

Az attribútumokat futásidőben a .NET-tükröződés használatával kérdezheti le.

Az előző kód példához hasonlóan több attribútumot is deklarálhat egyenként, deklarálhatja őket egy zárójelben, ha pontosvesszővel választja el az egyes attribútumokat és konstruktorokat az alábbiak szerint:

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

Az általában előforduló attribútumok közé tartozik a Obsolete attribútum, a biztonsági szempontok attribútumai, a COM-támogatás attribútumai, a kód tulajdonjogához kapcsolódó attribútumok és az attribútumok, amelyek jelzik, hogy egy típus szerializálható-e. Az alábbi példa a Obsolete attribútum használatát mutatja be.

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

Az assembly és moduleattribútumok esetében a legfelső szintű do kötést alkalmazza az összeállításában. Az attribútumdeklarációban a assembly vagy ``module`` szót az alábbiak szerint lehet megadni:

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

Ha kihagyja egy do kötésre alkalmazott attribútum célhelyét, az F#-fordító megkísérli meghatározni az attribútumnak megfelelő attribútumcélt. Számos attribútumosztály rendelkezik olyan System.AttributeUsageAttribute típusú attribútummal, amely az attribútum által támogatott lehetséges célokra vonatkozó információkat tartalmazza. Ha a System.AttributeUsageAttribute azt jelzi, hogy az attribútum célként támogatja a függvényeket, az attribútum a program fő belépési pontjára lesz alkalmazva. Ha a System.AttributeUsageAttribute azt jelzi, hogy az attribútum támogatja a szerelvények célként való megjelölését, a fordító úgy veszi, hogy az attribútum a szerelvényre alkalmazandó. A legtöbb attribútum nem vonatkozik mind a függvényekre, mind a szerelvényekre, de azokban az esetekben, amikor igen, az attribútum a program fő függvényére vonatkozik. Ha az attribútumcél explicit módon van megadva, az attribútum a megadott célra lesz alkalmazva.

Bár általában nem kell explicit módon megadnia az attribútumcélt, az attribútumban cél érvényes értékei, valamint a használati példák az alábbi táblázatban láthatók:

Attribútumcél Példa
összeszerelés
[<assembly: AssemblyVersion("1.0.0.0")>]
modul
[<``module``: MyCustomAttributeThatWorksOnModules>]
módszer
[<MyCustomAttributeThatWorksOnMethods>]
let someFunction() = 42
osztály
[<MyCustomAttributeThatWorksOnClasses>]
type MyClass(myValue: int) =
    member _.MyValue = myValue
Struktúra
[<MyCustomAttributeThatWorksOnStructs>]
[<Struct>]
type MyStruct(myValue: int) =
    member _.MyValue = myValue
interfész
[<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
visszatérés
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
mező
[<DefaultValue>] val mutable x: int
ingatlan
[<Obsolete>] this.MyProperty = x
paraméter
member this.MyMethod([<Out>] x : ref<int>) = x := 10
típus
[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

Lásd még: