Nameof

식은 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)

마지막 줄은 예외를 throw하고 "month" 오류 메시지에 표시됩니다.

거의 모든 F# 구문의 이름을 사용할 수 있습니다.

module M =
    let f x = nameof x

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

nameof 는 일류 함수가 아니고 이와 같이 사용할 수 없습니다. 즉, 부분적으로 적용할 수 없으며 F# 파이프라인 연산자를 통해 값을 파이프할 수 없습니다.

연산자에서 Nameof

F#의 연산자는 연산자 텍스트 자체 또는 컴파일된 양식을 나타내는 기호로 두 가지 방법으로 사용할 수 있습니다. 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