Saya telah melihat F # baru-baru ini, dan sementara saya tidak mungkin untuk melompat pagar dalam waktu dekat, itu pasti menyoroti beberapa area di mana C # (atau dukungan perpustakaan) dapat membuat hidup lebih mudah.
Secara khusus, saya sedang berpikir tentang kemampuan pencocokan pola F #, yang memungkinkan sintaks yang sangat kaya - jauh lebih ekspresif daripada saklar saat ini / yang setara dengan C #. Saya tidak akan mencoba memberikan contoh langsung (F # saya tidak sesuai), tetapi singkatnya itu memungkinkan:
- cocok dengan jenis (dengan pemeriksaan cakupan penuh untuk serikat yang didiskriminasi) [perhatikan ini juga menyimpulkan jenis untuk variabel terikat, memberikan akses anggota dll]
- cocok dengan predikat
- kombinasi di atas (dan mungkin beberapa skenario lain yang tidak saya sadari)
Meskipun akan menyenangkan bagi C # untuk akhirnya meminjam [ahem] sebagian dari kekayaan ini, untuk sementara saya telah melihat apa yang dapat dilakukan saat runtime - misalnya, cukup mudah untuk menyatukan beberapa objek untuk memungkinkan:
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
di mana getRentPrice adalah Func <Vehicle, int>.
[note - mungkin Switch / Kasing di sini adalah istilah yang salah ... tapi itu menunjukkan ide]
Bagi saya, ini jauh lebih jelas daripada yang setara menggunakan mengulangi if / else, atau conditional terner komposit (yang menjadi sangat berantakan untuk ekspresi non-sepele - kurung berlimpah). Ini juga menghindari banyak casting, dan memungkinkan untuk ekstensi sederhana (baik secara langsung atau melalui metode ekstensi) untuk pertandingan yang lebih spesifik, misalnya pertandingan InRange (...) yang sebanding dengan VB Select ... Case "x To y "penggunaan.
Saya hanya mencoba untuk mengukur apakah orang berpikir ada banyak manfaat dari konstruksi seperti di atas (tanpa adanya dukungan bahasa)?
Perhatikan juga bahwa saya telah bermain dengan 3 varian di atas:
- versi Fungsi <TSource, TValue> untuk evaluasi - sebanding dengan pernyataan kondisional ternary komposit
- versi Action <TSource> - dapat dibandingkan dengan if / else if / else if / else if / else
- versi Expression <Func <TSource, TValue >> - sebagai yang pertama, tetapi dapat digunakan oleh penyedia LINQ yang sewenang-wenang
Selain itu, menggunakan versi berbasis-Ekspresi memungkinkan penulisan ulang Expression-tree, pada dasarnya inline semua cabang menjadi Ekspresi bersyarat komposit tunggal, daripada menggunakan doa berulang-ulang. Saya belum memeriksanya baru-baru ini, tetapi dalam beberapa pengembangan Entitas Framework awal saya ingat ini diperlukan, karena tidak terlalu menyukai InvocationExpression. Ini juga memungkinkan penggunaan yang lebih efisien dengan LINQ-to-Objects, karena ia menghindari pemanggilan delegasi berulang - tes menunjukkan kecocokan seperti di atas (menggunakan formulir Ekspresi) yang bekerja pada kecepatan yang sama [sedikit lebih cepat, pada kenyataannya] dibandingkan dengan C # yang setara pernyataan bersyarat komposit. Untuk kelengkapan, versi berbasis Func <...> membutuhkan waktu 4 kali lebih lama daripada pernyataan kondisional C #, tetapi masih sangat cepat dan tidak mungkin menjadi hambatan utama dalam sebagian besar kasus penggunaan.
Saya menyambut setiap pemikiran / masukan / kritik / dll di atas (atau tentang kemungkinan dukungan bahasa C # lebih kaya ... di sini berharap ;-p).
switch-case
pernyataan. Jangan salah paham, saya pikir ini tempatnya dan saya mungkin akan mencari cara untuk mengimplementasikannya.