Sdílet prostřednictvím


Nameof

Výraz nameof vytvoří řetězcovou konstantu, která odpovídá názvu ve zdroji pro téměř jakýkoli konstruktor jazyka F# ve zdroji.

Syntaxe

nameof symbol
nameof<'TGeneric>

Poznámky

nameof funguje tak, že přeloží předaný symbol a vytvoří název tohoto symbolu, protože je deklarován ve zdrojovém kódu. To je užitečné v různých scénářích, jako je protokolování, a chrání vaše protokolování před změnami ve zdrojovém kódu.

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)

Poslední řádek vyvolá výjimku a "month" zobrazí se v chybové zprávě.

Název téměř každého konstruktoru jazyka F#:

module M =
    let f x = nameof x

printfn $"{(M.f 12)}"
printfn $"{(nameof M)}"
printfn $"{(nameof M.f)}"

nameof není prvotřídní funkce a nelze ji použít. To znamená, že nelze částečně použít a hodnoty do ní nelze vložit prostřednictvím operátorů kanálu F#.

Nameof on operators

Operátory v jazyce F# lze použít dvěma způsoby, jako samotný text operátoru nebo symbol představující kompilovaný formulář. nameof operátor vytvoří název operátoru, protože je deklarován ve zdroji. Pokud chcete získat zkompilovaný název, použijte zkompilovaný název ve zdroji:

nameof(+) // "+"
nameof op_Addition // "op_Addition"

Nameof on generics

Můžete také použít název parametru obecného typu, ale syntaxe se liší:

let f<'a> () = nameof<'a>
f() // "a"

nameof<'TGeneric> převezme název symbolu definovaný ve zdroji, nikoli název typu nahrazeného v lokalitě volání.

Důvodem, proč se syntaxe liší, je sladit s jinými vnitřními operátory jazyka F# jako typeof<> a typedefof<>. Díky tomu je jazyk F# konzistentní s ohledem na operátory, které fungují na obecných typech a cokoli jiného ve zdroji.

Nameof in pattern matching

Vzor nameof umožňuje použít nameof ve výrazu shody vzorů, například takto:

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 with instance members

Jazyk F# vyžaduje instanci k extrahování názvu člena instance s nameof. Pokud instance není snadno dostupná, lze ji získat pomocí 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