Atribut (F#)

Atribut memungkinkan metadata diterapkan ke konstruksi pemrograman.

Sintaks

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

Keterangan

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

Nama atribut mengacu pada nama (mungkin memenuhi syarat dengan namespace layanan) 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 bernama dapat digunakan jika atribut memiliki properti publik. Anda dapat mengaturnya dengan menggunakan sintaks berikut dalam daftar argumen.

property-name = property-value

Inisialisasi properti seperti itu bisa dalam urutan apa pun, tetapi mereka harus mengikuti argumen posisi. 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 adalah DllImportAttribute, di sini digunakan dalam bentuk pendek. Argumen pertama adalah parameter posisi dan yang kedua adalah properti.

Atribut adalah konstruksi pemrograman .NET yang memungkinkan objek yang dikenal sebagai atribut untuk dikaitkan dengan jenis atau elemen program lainnya. Elemen program di mana 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 pada konstruksi pemrograman berikut: fungsi, metode, rakitan, modul, tipe (kelas, catatan, struktur, antarmuka, delegasi, enumerasi, gabungan, dan sebagainya), konstruktor, properti, bidang, parameter, jenis parameter, 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 durasi dengan menggunakan refleksi .NET.

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

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

Biasanya ditemui atribut termasuk atribut Obsolete, atribut untuk pertimbangan keamanan, atribut untuk dukungan COM, atribut yang berhubungan dengan kepemilikan kode, dan atribut yang menunjukkan apakah jenis dapat diserialkan. 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 atribut yang menargetkan assembly dan module, Anda menerapkan atribut ke pengikatan do tingkat atas di rakitan 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, kompilator 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 rakitan sebagai target, kompilator mengambil atribut untuk diterapkan ke rakitan. Sebagian besar atribut tidak berlaku untuk fungsi dan rakitan, tetapi jika melakukannya, atribut diambil untuk diterapkan ke fungsi utama program. Jika target atribut ditentukan secara eksplisit, atribut akan 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 akan ditampilkan dalam tabel berikut:

Target atribut Contoh
rakitan
[<assembly: AssemblyVersion("1.0.0.0")>]
modul
[<``module``: MyCustomAttributeThatWorksOnModules>]
return
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
bidang
[<DefaultValue>] val mutable x: int
properti
[<Obsolete>] this.MyProperty = x
param
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