SORU
1 EKİM 2008, ÇARŞAMBA


geçiş / desen eşleştirme fikir

Aradım F# son zamanlarda, ve ben büyük olasılıkla bir sıçrama çit yakın bir zamanda, kesinlikle olayları bazı alanlarda nerede C# (veya kütüphane desteği) olabilir yapmak hayat daha kolay.

Çok zengin bir sözdizimi - koşullu C/geçerli geçiş çok daha etkileyici sağlayan özellikle, desen F yeteneği eşleşen düşünüyorum#,# eşdeğerleri. Doğrudan bir örnek versem daha iyi olmaz (benim F# değil o kadar), ama Kısacası sağlar:

  • türü (ayrımcılık sendikalar için tam kapsama kontrolü ile) [not bu da bağımlı değişkenin türü, üye erişim vb vererek algılar] maç
  • yüklem ile maç
  • yukarıdaki kombinasyonları (ve muhtemelen benim bilmediğim başka bir senaryo)

Süre iyi olur C# sonunda ödünç [HIM] bazıları bu zenginliği, Ara aradım ne yapılabilir çalışma zamanında örneğin, bu oldukça kolay knock birlikte bazı nesneler için izin:

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

getRentPrice bir İşlev<Araç,int>.

[not - belki/diye burada yanlış terimler... ama fikir gösterir Anahtarı]

Bana, bu eşdeğer daha bir sürü net/eğer başka bir tekrarlanan, ya da bir bileşik üçlü koşullu önemsiz olmayan ifadeler parantez galore için çok karışık olan) kullanıyor. Bunu da önlerçokdöküm ve sağlar için basit bir uzantısı (ya doğrudan ya da üzerinden uzatma yöntemleri) daha özel maçlar için örnek bir İnRange(...) maç karşılaştırılabilir VB Select...Case "x y" kullanımı.

Eğer yukarıdaki gibi yapıları (dil desteği yokluğunda) çok faydası olduğunu düşünüyorum eğer ölçmek için çalışıyorum?

Yukarıdaki 3 türevleri ile oynuyorum ayrıca not:

  • bir İşlev<TSource,TValue> değerlendirme için sürüm - kompozit üçlü koşullu ifadeler karşılaştırılabilir
  • bir Eylem<TSource> sürüm - eğer/else if/else else//eğer başka bir karşılaştırılabilir
  • İfade<İşlev<TSource,TValue>> sürümü - ilk olarak, ama keyfi ETMENİZ sağlayıcılar tarafından kullanılabilir

Ayrıca, İfade tabanlı sürümünü kullanarak İfade ağacı yeniden yazmak, aslında bir tek bileşik koşullu ifadede tüm dalları satır içi uygulaması, tekrarlayan çağırma kullanmak yerine sağlar. Son zamanlarda kontrol etmedim ama biraz erken Varlık Çerçeve İnvocationExpression çok olmadı bu hatırladığım kadarıyla gerekli oluşturur. Ayrıca sağlar daha verimli kullanımı ile SERİ-Nesneler, beri önler tekrarlanan temsilci çağırmaları - test sonucunu beklemekten başka yapacak bir maç gibi yukarıdaki (kullanarak İfade şekli) sahne aynı hız [oldukça hızlı, olguya göre eşdeğer C# bileşik koşullu deyim. Kabul, İşlev<...> tabanlı sürümü aldı 4 kat daha uzun olarak C# koşullu deyim, ama hala çok hızlı ve olası bir büyük darboğaz içinde en kullanım durumları.

/ Giriş / eleştiri / etc yukarıdaki herhangi bir düşünce hoş geldiniz (ya da daha zengin C olanaklarını# dil desteği... umarım öyle olur ;-p).

CEVAP
1 EKİM 2008, ÇARŞAMBA


Bart De Smet excellent blog tarif tam olarak ne üzerine 8 bölümlük bir dizi var. İlk bölümü here bul.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kai Moosmann

    Kai Moosmann

    5 Temmuz 2006
  • Manuel Vizcaino

    Manuel Vizca

    27 Mayıs 2008
  • The Warp Zone

    The Warp Zon

    24 AĞUSTOS 2007