nameof
式は、ソース内のほぼすべての F# コンストラクトのソース内の名前と一致する文字列定数を生成します。
構文
nameof symbol
nameof<'TGeneric>
注釈
nameof
は、渡されたシンボルを解決することによって機能し、ソース コードで宣言されているシンボルの名前を生成します。 これは、ログ記録などのさまざまなシナリオで役立ち、ソース コードの変更からログを保護します。
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)
最後の行で例外がスローされ、 "month"
がエラー メッセージに表示されます。
ほぼすべての F# コンストラクトの名前を取得できます。
module M =
let f x = nameof x
printfn $"{(M.f 12)}"
printfn $"{(nameof M)}"
printfn $"{(nameof M.f)}"
nameof
はファーストクラスの関数ではないため、そのように使用することはできません。 つまり、部分的には適用できず、F# パイプライン演算子を使用して値をパイプ処理することはできません。
演算子の Nameof
F# の演算子は、演算子テキスト自体として、またはコンパイル済みのフォームを表すシンボルとして、2 つの方法で使用できます。
nameof
演算子では、ソースで宣言されている演算子の名前が生成されます。 コンパイルされた名前を取得するには、ソースでコンパイル済みの名前を使用します。
nameof(+) // "+"
nameof op_Addition // "op_Addition"
ジェネリックの Nameof
ジェネリック型パラメーターの名前を取得することもできますが、構文は異なります。
let f<'a> () = nameof<'a>
f() // "a"
nameof<'TGeneric>
は、呼び出しサイトで置換された型の名前ではなく、ソースで定義されているシンボルの名前を受け取ります。
構文が異なる理由は、 typeof<>
や typedefof<>
などの他の F# 組み込み演算子と一致するためです。 これにより、F# は、ジェネリック型やソース内の他の何かを処理する演算子に関して一貫性を持たせます。
パターン マッチングの Nameof
nameof
パターンを使用すると、次のようにパターン マッチ式で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
インスタンス メンバーを含む Nameof
F# では、 nameof
を持つインスタンス メンバーの名前を抽出するためにインスタンスが必要です。 インスタンスを簡単に使用できない場合は、 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
.NET