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ą nameof
polecenia . 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