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