Son zamanlarda F # bakıyordum ve çitin yakın zamanda sıçraması muhtemel olmasa da, kesinlikle C # (veya kütüphane desteği) hayatı kolaylaştırabilecek bazı alanları vurgular.
Özellikle, çok zengin bir sözdizimi sağlayan geçerli eşleme / koşullu C # eşdeğerlerinden çok daha etkileyici olan F # desen eşleştirme yeteneğini düşünüyorum. Doğrudan bir örnek vermeye çalışmayacağım (benim F # buna bağlı değil), ancak kısaca şunları sağlar:
- türe göre eşleştirme (ayrımcı sendikalar için tam kapsamlı denetimle) [bunun ayrıca ilişkili değişkenin türünü de ihlal ettiğini, üye erişimi vb. verdiğini unutmayın]
- yüklemle eşleştir
- yukarıdakilerin kombinasyonları (ve muhtemelen farkında olmadığım bazı senaryolar)
C # için bu zenginliğin sonunda [ahem] ödünç alması hoş olsa da, bu arada çalışma zamanında neler yapılabileceğine bakıyordum - örneğin, izin vermek için bazı nesneleri bir araya getirmek oldukça kolaydır:
var getRentPrice = new Switch<Vehicle, int>()
.Case<Motorcycle>(bike => 100 + bike.Cylinders * 10) // "bike" here is typed as Motorcycle
.Case<Bicycle>(30) // returns a constant
.Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20)
.Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20)
.ElseThrow(); // or could use a Default(...) terminator
burada getRentPrice bir Func <Vehicle, int>.
[not - belki Switch / Case burada yanlış terimler ... ama fikri gösteriyor]
Bana göre, bu, tekrarlanan if / else kullanarak eşdeğerden çok daha net veya kompozit üçlü koşullu (önemsiz olmayan ifadeler için çok dağınık hale geliyor - parantez bolca). Ayrıca çok fazla dökümden kaçınır ve daha spesifik eşleşmelere basit bir şekilde uzatma (doğrudan veya uzatma yöntemleri ile), örneğin VB Seçimi ile karşılaştırılabilir bir InRange (...) eşleşmesi sağlar ... Durum "x To y "kullanım.
İnsanların yukarıdaki gibi yapılardan çok fazla fayda sağladığını düşünüyorsa (dil desteğinin yokluğunda) ölçmeye çalışıyorum?
Ayrıca yukarıdakilerin 3 çeşidi ile oynadığımı unutmayın:
- a Func <TSource, TValue> sürümü değerlendirme - kompozit üçlü koşullu ifadelerle karşılaştırılabilir
- Eylem <TSource> sürümü - if / else if / else if / else if / else ile karşılaştırılabilir
- bir İfade <İşlev <TSource, TValue >> sürümü - ilk olarak, ancak keyfi LINQ sağlayıcıları tarafından kullanılabilir
Ayrıca, İfade tabanlı sürümün kullanılması, tekrarlanan çağırma yerine temelde tüm dalları tek bir bileşik koşullu İfade haline getirerek İfade ağacının yeniden yazılmasını sağlar. Yakın zamanda kontrol etmedim, ancak bazı erken Entity Framework yapılarında, InvocationExpression'ı çok sevmediği için gerekli olduğunu hatırlıyorum. Ayrıca, tekrarlanan delege çağrılarını önlediği için LINQ'dan Nesnelere daha verimli kullanım sağlar - testler, eşdeğer C # ile karşılaştırıldığında aynı hızda (aslında marjinal olarak daha hızlı) performans gösteren yukarıdaki gibi (İfade formunu kullanarak) bir eşleşme gösterir bileşik koşullu deyim. Tamlık için, Func <...> tabanlı sürüm, C # koşullu ifadesinin 4 katı kadar sürdü, ancak yine de çok hızlı ve çoğu kullanım durumunda büyük bir darboğaz olması pek olası değil.
Yukarıdakiler (ya da daha zengin C # dil desteği olanakları üzerine düşüncelerinizi / giriş / eleştirilerinizi / vb.
switch-case
ifade yerine kullanmasını caydırırdım . Beni yanlış anlamayın, bence yeri var ve muhtemelen bir uygulama yolu arayacağım.