Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 typeof<>gibi typedefof<> 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 desen eşleştirme ifadesinde kullanmanıza nameof olanak tanır. Bu, dize değerlerini kodunuzdaki simgelerin adlarıyla eşleştirirken, yeniden düzenleme yaparken derleme zamanı güvenliği ve otomatik güncelleştirmeler sağlarken özellikle yararlıdır.
Pratik bir örnek, dize değerlerinin tür veya büyük/küçük harf adlarını temsil ettiği olayları veya iletileri seri durumdan çıkarmadır:
type EventType =
| OrderCreated
| OrderShipped
| OrderDelivered
let handleEvent eventName data =
match eventName with
| nameof OrderCreated -> printfn "Processing order creation: %s" data
| nameof OrderShipped -> printfn "Processing order shipment: %s" data
| nameof OrderDelivered -> printfn "Processing order delivery: %s" data
| _ -> printfn "Unknown event type: %s" eventName
handleEvent "OrderCreated" "Order #123" // matches first case
gibi "OrderCreated" dize değişmez değerleri yerine kullanmak nameof çeşitli avantajlar sağlar:
- Ayrımcı bir birleşim olayını yeniden adlandırırsanız, desen otomatik olarak güncelleştirilir.
- Derleyici, simgenin mevcut olduğundan emin olarak yazım hatalarını önler.
- Kodunuz yeniden düzenleme sırasında tutarlı kalır.
Ayrıca şu parametrelerle de kullanabilirsiniz 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
Ö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