Nameof

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

Syntax

nameof symbol
nameof<'TGeneric>

Açıklamalar

nameof , simgesine geçirilen sembolü çözerek çalışır ve kaynak kodunda bildirilen bu sembolün adını üretir. Bu, günlüğe kaydetme gibi çeşitli senaryolarda yararlıdır ve günlük kaydınızı kaynak kodundaki 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 "month" ve hata iletisinde gösterilir.

Neredeyse her F# yapısı için bir ad ve sonra da şu adlardan bir ad vesersiniz:

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 uygulanamaz ve F# işlem hattı işleçleri aracılığıyla değerlere kanala aktarılamayacak anlamına gelir.

İşleçlerde Nameof

F# işleçleri, işleç metni olarak veya derlenmiş formu temsil eden bir sembol olarak iki şekilde kullanılabilir. nameof bir işleç üzerinde, kaynakta bildirilen işlecinin adını üretir. Derlenmiş 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 alasiniz, ancak söz dizimi farklıdır:

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

nameof<'TGeneric> , bir çağrı sitesinde yerine geçen türün adını değil, kaynakta tanımlandığı şekilde sembol adını alır.

Söz dizimünün farklı bir nedeni, ve gibi diğer F# iç işleçleriyle typeof<> typedefof<> hizalamaktır. Bu, F# ile genel türler ve kaynakta başka herhangi bir şey üzerinde eylem yapan işleçler ile tutarlı hale gelir.

Desen eşleştirmede nameof

nameof Desen, aşağıdaki gibi bir desen eşleşme nameof ifadesinde kullanmana olanak sağlar:

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 bir örnek üyesinin adını ayıklamak için bir örnek nameof gerektirir. Bir örnek kolayca kullanılamıyorsa, kullanılarak bir örnek elde Unchecked.defaultof 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