Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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.
Szemantika
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 egy mintaegyeztetési kifejezésben használjon nameof . Ez különösen akkor hasznos, ha sztringértékeket egyeztet a kód szimbólumainak nevével, így fordítási időt és automatikus frissítéseket biztosít az újrabontáskor.
Gyakorlati példa az események vagy üzenetek deszerializálása, ahol a sztringértékek típus- vagy esetneveket jelölnek:
type EventType =
| OrderCreated
| OrderShipped
| OrderDelivered
let handleEvent eventName data =
match eventName with
| nameof OrderCreated -> printfn "Processing order creation: %s" data
| nameof OrderShipped -> printfn "Processing order shipment: %s" data
| nameof OrderDelivered -> printfn "Processing order delivery: %s" data
| _ -> printfn "Unknown event type: %s" eventName
handleEvent "OrderCreated" "Order #123" // matches first case
A sztringkonstansok, például "OrderCreated" a használata nameof számos előnnyel jár:
- Ha átnevez egy diszkriminált uniós esetet, a minta automatikusan frissül.
- A fordító a szimbólum meglétének biztosításával megakadályozza az elírásokat.
- A kód konzisztens marad az újrabontás során.
Paraméterekkel is használható nameof :
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.defaultofszerezhető 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