Nameof

ifadesi, nameof kaynaktaki neredeyse tüm F# yapıları için kaynaktaki adla eşleşen bir dize sabiti oluşturur.

Sözdizimi

nameof symbol
nameof<'TGeneric>

Açıklamalar

nameof , ona geçirilen simgeyi çözümleyerek çalışır ve kaynak kodunuzda bildirilirken bu simgenin adını üretir. Bu, günlüğe kaydetme gibi çeşitli senaryolarda kullanışlıdır ve günlük kaydınızı kaynak koddaki değişikliklere karşı korur.

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)

Son satır bir özel durum oluşturur ve "month" hata iletisinde gösterilir.

Neredeyse her F# yapısının adını alabilirsiniz:

module M =
    let f x = nameof x

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

nameof birinci sınıf bir işlev değildir ve bu şekilde kullanılamaz. Bu, kısmen uygulanamayacağı ve değerler F# işlem hattı işleçleri aracılığıyla içine aktarılamayacağı anlamına gelir.

İşleçlerde nameof

F# içindeki işleçler, işleç metninin kendisi veya derlenmiş formu temsil eden bir simge olarak iki şekilde kullanılabilir. nameof bir işleç, kaynakta bildirildiği gibi işlecin adını üretir. Derlenen adı almak için kaynakta derlenmiş adı kullanın:

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

Genel türlerde nameof

Genel tür parametresinin adını da alabilirsiniz, ancak söz dizimi farklıdır:

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

nameof<'TGeneric> , kaynakta tanımlandığı gibi simgenin adını alır, çağrı sitesinde değiştirilen türün adını almaz.

Söz diziminin farklı olmasının nedeni, ve typedefof<>gibi typeof<> diğer F# iç işleçleriyle hizalamaktır. Bu, F# öğesinin genel türler ve kaynaktaki diğer her şey üzerinde işlem yapan işleçlerle tutarlı olmasını sağlar.

Desen eşleştirmede nameof

Desen, nameof aşağıdaki gibi bir desen eşleştirme ifadesinde kullanmanıza nameof olanak tanır:

let f (str: string) =
    match str with
    | nameof str -> "It's 'str'!"
    | _ -> "It is not 'str'!"

f "str" // matches
f "asdf" // does not match

Örnek üyeleriyle nameof

F# ile nameoförnek üyesinin adını ayıklamak için bir örnek gerektirir. Bir örnek kolayca kullanılamıyorsa, kullanılarak Unchecked.defaultofbir örnek elde edilebilir.

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