Bagikan melalui


Atribut (F#)

Atribut memungkinkan metadata diterapkan ke konstruksi pemrograman.

Sintaksis

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

Komentar

Dalam sintaks sebelumnya, target bersifat opsional dan, jika ada, menentukan jenis entitas program yang diterapkan atribut. Nilai yang valid untuk target diperlihatkan dalam tabel yang akan muncul nanti dalam dokumen ini.

Nama atribut mengacu pada nama (mungkin memenuhi syarat dengan namespace) dari jenis atribut yang valid, dengan atau tanpa akhiran Attribute yang biasanya digunakan dalam nama jenis atribut. Misalnya, jenis ObsoleteAttribute dapat disingkat menjadi hanya Obsolete dalam konteks ini.

Argumen adalah argumen ke konstruktor untuk jenis atribut. Jika atribut memiliki konstruktor tanpa parameter, daftar argumen dan tanda kurung dapat dihilangkan. Atribut mendukung argumen posisi dan argumen bernama. Argumen posisi adalah argumen yang digunakan dalam urutan munculnya argumen tersebut. Argumen bernama dapat digunakan jika atribut memiliki properti publik. Anda dapat mengaturnya dengan menggunakan sintaks berikut dalam daftar argumen.

property-name = property-value

Inisialisasi properti tersebut dapat dalam urutan apa pun, tetapi harus mengikuti argumen posisi apa pun. Berikut ini adalah contoh atribut yang menggunakan argumen posisi dan inisialisasi properti:

open System.Runtime.InteropServices

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

Dalam contoh ini, atributnya DllImportAttribute, digunakan dalam bentuk singkat di sini. Argumen pertama adalah parameter posisi dan yang kedua adalah properti.

Atribut adalah konstruksi pemrograman .NET yang memungkinkan objek yang dikenal sebagai atribut dikaitkan dengan jenis atau elemen program lainnya. Elemen program tempat atribut diterapkan dikenal sebagai target atribut . Atribut biasanya berisi metadata tentang targetnya. Dalam konteks ini, metadata dapat berupa data apa pun tentang jenis selain bidang dan anggotanya.

Atribut dalam F# dapat diterapkan ke konstruksi pemrograman berikut: fungsi, metode, rakitan, modul, jenis (kelas, rekaman, struktur, antarmuka, delegasi, enumerasi, serikat, dan sebagainya), konstruktor, properti, bidang, parameter, parameter jenis, dan mengembalikan nilai. Atribut tidak diizinkan pada pengikatan let di dalam kelas, ekspresi, atau ekspresi alur kerja.

Biasanya, deklarasi atribut muncul langsung sebelum deklarasi target atribut. Beberapa deklarasi atribut dapat digunakan bersama-sama, sebagai berikut:

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

Anda dapat mengkueri atribut pada waktu proses dengan menggunakan refleksi .NET.

Anda dapat mendeklarasikan beberapa atribut satu per satu, seperti dalam contoh kode sebelumnya, atau Anda dapat mendeklarasikannya dalam satu set tanda kurung siku jika Anda menggunakan titik koma untuk memisahkan atribut dan konstruktor individual, sebagai berikut:

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

Atribut yang biasanya ditemui termasuk atribut Obsolete, atribut untuk pertimbangan keamanan, atribut untuk dukungan COM, atribut yang terkait dengan kepemilikan kode, dan atribut yang menunjukkan apakah jenis dapat diserialisasikan. Contoh berikut menunjukkan penggunaan atribut Obsolete.

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

Untuk target atribut assembly dan module, Anda menerapkan atribut ke pengikatan do pada tingkat teratas di dalam assembly Anda. Anda dapat menyertakan kata assembly atau ``module`` dalam deklarasi atribut, sebagai berikut:

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

Jika Anda menghilangkan target atribut untuk atribut yang diterapkan ke pengikatan do, pengkompilasi F# mencoba menentukan target atribut yang masuk akal untuk atribut tersebut. Banyak kelas atribut memiliki atribut jenis System.AttributeUsageAttribute yang menyertakan informasi tentang kemungkinan target yang didukung untuk atribut tersebut. Jika System.AttributeUsageAttribute menunjukkan bahwa atribut mendukung fungsi sebagai target, atribut diambil untuk diterapkan ke titik masuk utama program. Jika System.AttributeUsageAttribute menunjukkan bahwa atribut mendukung assembly sebagai target, kompilator mengambil atribut untuk diterapkan ke assembly. Sebagian besar atribut tidak berlaku untuk fungsi dan rakitan, tetapi dalam kasus di mana mereka melakukannya, atribut diambil untuk diterapkan ke fungsi utama program. Jika target atribut ditentukan secara eksplisit, atribut diterapkan ke target yang ditentukan.

Meskipun Anda biasanya tidak perlu menentukan target atribut secara eksplisit, nilai yang valid untuk target dalam atribut bersama dengan contoh penggunaan ditampilkan dalam tabel berikut:

Atribut sasaran Contoh
pertemuan
[<assembly: AssemblyVersion("1.0.0.0")>]
modul
[<``module``: MyCustomAttributeThatWorksOnModules>]
Metode
[<MyCustomAttributeThatWorksOnMethods>]
let someFunction() = 42
kelas
[<MyCustomAttributeThatWorksOnClasses>]
type MyClass(myValue: int) =
    member _.MyValue = myValue
struktur
[<MyCustomAttributeThatWorksOnStructs>]
[<Struct>]
type MyStruct(myValue: int) =
    member _.MyValue = myValue
antarmuka
[<MyCustomAttributeThatWorksOnInterfaces>]
type MyInterface =
    abstract member Prop: string
enum
[<MyCustomAttributeThatWorksOnEnums>]
type Color =
    | Red = 0
    | Green = 1
    | Blue = 2
pembangun
type MyClass(myValue: int) =
    member _.MyValue = myValue

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

Lihat juga