Megosztás a következőn keresztül:


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.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