Nameof
Ekspresi nameof
menghasilkan konstanta string yang cocok dengan nama di sumber untuk hampir semua konstruksi F# dalam sumber.
Sintaks
nameof symbol
nameof<'TGeneric>
Keterangan
nameof
bekerja dengan menyelesaikan simbol yang diteruskan ke dalamnya dan menghasilkan nama simbol tersebut seperti yang dinyatakan dalam kode sumber Anda. Ini berguna dalam berbagai skenario, seperti pengelogan, dan melindungi pengelogan Anda dari perubahan kode sumber.
let months =
[
"January"; "February"; "March"; "April";
"May"; "June"; "July"; "August"; "September";
"October"; "November"; "December"
]
let lookupMonth month =
if (month > 12 || month < 1) then
invalidArg (nameof month) ($"Value passed in was %d{month}.")
months[month-1]
printfn "%s" (lookupMonth 12)
printfn "%s" (lookupMonth 1)
printfn "%s" (lookupMonth 13)
Baris terakhir akan memberikan pengecualian dan "month"
akan ditampilkan dalam pesan kesalahan.
Anda dapat mengambil nama hampir setiap konstruksi F#:
module M =
let f x = nameof x
printfn $"{(M.f 12)}"
printfn $"{(nameof M)}"
printfn $"{(nameof M.f)}"
nameof
bukan fungsi kelas satu dan tidak dapat digunakan seperti itu. Artinya, tidak dapat diterapkan sebagian dan nilai tidak dapat disalurkan ke dalamnya melalui operator alur F#.
Nameof pada operator
Operator dalam F# dapat digunakan dengan dua cara, sebagai teks operator itu sendiri, atau simbol yang mewakili formulir yang dikompilasi. nameof
pada operator akan menghasilkan nama operator seperti yang dinyatakan dalam sumber. Untuk mendapatkan nama yang dikompilasi, gunakan nama yang dikompilasi di sumber:
nameof(+) // "+"
nameof op_Addition // "op_Addition"
Nameof pada generik
Anda juga dapat mengambil nama parameter jenis generik, tetapi sintaksnya berbeda:
let f<'a> () = nameof<'a>
f() // "a"
nameof<'TGeneric>
akan mengambil nama simbol seperti yang ditentukan dalam sumber, bukan nama jenis yang diganti di situs panggilan.
Alasan mengapa sintaksisnya berbeda adalah untuk menyelaraskan dengan operator intrinsik F# lainnya seperti typeof<>
dan typedefof<>
. Ini membuat F# konsisten dengan memperhatikan operator yang bertindak berdasarkan jenis generik dan apa pun di sumbernya.
Nameof dalam pencocokan pola
Pola nameof
memungkinkan Anda menggunakan nameof
dalam ekspresi kecocokan pola seperti ini:
let f (str: string) =
match str with
| nameof str -> "It's 'str'!"
| _ -> "It is not 'str'!"
f "str" // matches
f "asdf" // does not match
Nameof dengan anggota instans
F# memerlukan instans untuk mengekstrak nama anggota instans dengan nameof
. Jika instans tidak mudah tersedia, instans dapat diperoleh menggunakan Unchecked.defaultof
.
type MyRecord = { MyField: int }
type MyClass() =
member _.MyProperty = ()
member _.MyMethod () = ()
nameof Unchecked.defaultof<MyRecord>.MyField // MyField
nameof Unchecked.defaultof<MyClass>.MyProperty // MyProperty
nameof Unchecked.defaultof<MyClass>.MyMethod // MyMethod