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 |
|
modul |
|
return |
|
bidang |
|
properti |
|
param |
|
jenis |
|