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.defaultof
bir ö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