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.

Syntax

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

Megjegyzések

Az előző szintaxisban a cél megadása nem kötelező, és ha van ilyen, meghatározza az attribútum által érintett programentitást. A célértékek érvényes értékei a dokumentum későbbi részében megjelenő táblázatban jelennek meg.

Az attribútumnév egy érvényes attribútumtípus nevének (esetleg névterekkel minősített) nevére hivatkozik, az attribútumtípusnevekben általában használt utótaggal Attribute vagy anélkül. A típus ObsoleteAttribute például ebben Obsolete a kontextusban lerövidíthető.

Az 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. A pozícióargumentumok olyan argumentumok, amelyek abban a sorrendben vannak használva, amelyben 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 rövidített DllImportAttributeformá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 objektum típushoz vagy más programelemhez legyen társítva. Az attribútumot alkalmazó programelemet attribútumcélnak nevezzük. 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 az osztályokon, kifejezéseken let vagy munkafolyamat-kifejezéseken belüli kötéseken.

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 az attribútum, a Obsolete 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 az attribútum használatát Obsolete 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 attribútumcélok assemblymoduleesetében az attribútumokat egy legfelső szintű do kötésre alkalmazza a szerelvényben. A szót assembly vagy ``module`` az attribútumdeklarációt az alábbiak szerint foglalhatja be:

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

Ha kihagyja a kötésre do 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 típusú System.AttributeUsageAttribute attribútummal, amely információkat tartalmaz az attribútum által támogatott lehetséges célokról. Ha az System.AttributeUsageAttribute attribútum 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 az System.AttributeUsageAttribute attribútum azt jelzi, hogy az attribútum célként támogatja a szerelvényeket, a fordító az attribútumot alkalmazza a szerelvényre. 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 lévő célértékek és a használati példák az alábbi táblázatban láthatók:

Attribútumcél Példa
szerelvény
[<assembly: AssemblyVersion("1.0.0.0")>]
modul
[<``module``: MyCustomAttributeThatWorksOnModules>]
vissza
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
mező
[<DefaultValue>] val mutable x: int
tulajdonság
[<Obsolete>] this.MyProperty = x
Param
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