Nazwa

Wyrażenie nameof tworzy stałą ciągu zgodną z nazwą w źródle dla niemal dowolnej konstrukcji języka F# w źródle.

Składnia

nameof symbol
nameof<'TGeneric>

Uwagi

nameof działa przez rozpoznawanie przekazanego do niego symbolu i generuje nazwę tego symbolu, ponieważ jest zadeklarowany w kodzie źródłowym. Jest to przydatne w różnych scenariuszach, takich jak rejestrowanie i chroni rejestrowanie przed zmianami w kodzie źródłowym.

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)

Ostatni wiersz zgłosi wyjątek i "month" zostanie wyświetlony w komunikacie o błędzie.

Możesz przyjąć nazwę niemal każdej konstrukcji języka F#:

module M =
    let f x = nameof x

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

nameof nie jest funkcją pierwszej klasy i nie może być używana jako taka. Oznacza to, że nie można jej częściowo zastosować, a wartości nie mogą być do niej przesyłane potokiem za pośrednictwem operatorów potoków języka F#.

Nameof on operators (Nazwaof na operatorach)

Operatory w języku F# mogą być używane na dwa sposoby, jako sam tekst operatora lub symbol reprezentujący skompilowany formularz. nameof operator wygeneruje nazwę operatora, który jest zadeklarowany w źródle. Aby uzyskać skompilowana nazwę, użyj skompilowanej nazwy w źródle:

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

Nameof on generics (Nazwa) w typach ogólnych

Możesz również przyjąć nazwę parametru typu ogólnego, ale składnia jest inna:

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

nameof<'TGeneric> będzie przyjmować nazwę symbolu zdefiniowanego w źródle, a nie nazwę typu zastąpionego w lokacji wywołania.

Powodem, dla którego składnia jest inna, jest dopasowanie do innych operatorów wewnętrznych języka F#, takich jak typeof<> i typedefof<>. Dzięki temu język F# jest zgodny z operatorami, które działają na typach ogólnych i innych elementach źródłowych.

Nameof w dopasowywaniu wzorca

Wzorzec nameof umożliwia użycie nameof w wyrażeniu dopasowania wzorca w następujący sposób:

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 z członkami wystąpienia

Język F# wymaga wystąpienia w celu wyodrębnienia nazwy elementu członkowskiego wystąpienia za pomocą nameofpolecenia . Jeśli wystąpienie nie jest łatwo dostępne, można je uzyskać przy użyciu polecenia 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