Név:
A nameof
kifejezés olyan sztringállandót hoz létre, amely megfelel a forrásban lévő névnek a forrásban lévő szinte bármilyen F#-szerkezethez.
Syntax
nameof symbol
nameof<'TGeneric>
Megjegyzések
nameof
úgy működik, hogy feloldja a neki átadott szimbólumot, és létrehozza a szimbólum nevét a forráskódban deklarált módon. Ez különböző helyzetekben hasznos, például naplózás esetén, és védelmet nyújt a naplózásnak a forráskód változásaival szemben.
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)
Az utolsó sor kivételt eredményez, és "month"
megjelenik a hibaüzenetben.
Szinte minden F#-szerkezet nevét felveheti:
module M =
let f x = nameof x
printfn $"{(M.f 12)}"
printfn $"{(nameof M)}"
printfn $"{(nameof M.f)}"
nameof
nem első osztályú függvény, ezért nem használható. Ez azt jelenti, hogy nem alkalmazható részlegesen, és az értékek nem csövezhetők bele az F#-folyamat operátorai segítségével.
Operátorok neve
Az F# operátorai kétféleképpen használhatók operátorszövegként, vagy a lefordított űrlapot jelképező szimbólumként. nameof
egy operátoron az operátor neve a forrásban deklarált módon jelenik meg. A lefordított név lekéréséhez használja a lefordított nevet a forrásban:
nameof(+) // "+"
nameof op_Addition // "op_Addition"
Általános nevek neve
Általános típusú paraméter nevét is felveheti, de a szintaxis eltérő:
let f<'a> () = nameof<'a>
f() // "a"
nameof<'TGeneric>
a forrásban definiált szimbólum nevét veszi fel, nem pedig a hívási helyen helyettesített típus nevét.
A szintaxis azért különbözik, mert más belső F#-operátorokhoz, például typeof<>
és typedefof<>
. Így az F# konzisztenssé válik az általános típusokat és a forrásban lévő bármi mást használó operátorokkal szemben.
Név a mintaegyeztetésben
A nameof
minta lehetővé teszi, hogy a minta egyező kifejezést használjon nameof
a következőképpen:
let f (str: string) =
match str with
| nameof str -> "It's 'str'!"
| _ -> "It is not 'str'!"
f "str" // matches
f "asdf" // does not match
Példánytagok neve
Az F# egy példányt igényel a példánytag nevének kinyeréséhez a következővel nameof
: . Ha egy példány nem könnyen érhető el, akkor a következővel Unchecked.defaultof
szerezhető be: .
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