मैं एफ # हाल ही में देख रहा हूं, और जब तक कि मैं जल्द ही किसी भी समय बाड़ को छलांग लगाने की संभावना नहीं रखता हूं, यह निश्चित रूप से कुछ क्षेत्रों को उजागर करता है जहां सी # (या पुस्तकालय समर्थन) जीवन को आसान बना सकता है।
विशेष रूप से, मैं एफ # की पैटर्न मिलान क्षमता के बारे में सोच रहा हूं, जो एक बहुत समृद्ध वाक्यविन्यास - वर्तमान स्विच / सशर्त सी # समकक्षों की तुलना में बहुत अधिक अभिव्यंजक अनुमति देता है। मैं एक प्रत्यक्ष उदाहरण देने की कोशिश नहीं करूँगा (मेरा F # इस पर निर्भर नहीं है), लेकिन संक्षेप में यह अनुमति देता है:
- प्रकार से मेल करें (भेदभावपूर्ण यूनियनों के लिए पूर्ण-कवरेज की जाँच के साथ) [ध्यान दें कि यह बाध्य चर के लिए प्रकार को भी सीमित करता है, सदस्य को एक्सेस देने आदि]
- विधेय द्वारा मिलान
- उपरोक्त संयोजन (और संभवतः कुछ अन्य परिदृश्यों के बारे में मुझे जानकारी नहीं है)
हालांकि यह C # के लिए प्यारा होगा, अंततः [ahem] इस समृद्धि में से कुछ, अंतरिम में मैं देख रहा हूं कि रनटाइम पर क्या किया जा सकता है - उदाहरण के लिए, अनुमति देने के लिए कुछ वस्तुओं को एक साथ दस्तक देना काफी आसान है:
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 एक फंक <वाहन, int> है।
[नोट - शायद स्विच / केस यहां गलत शब्द है ... लेकिन यह विचार दिखाता है]
मेरे लिए, यह / / या फिर एक समग्र टर्नरी सशर्त (जो गैर-तुच्छ अभिव्यक्तियों के लिए बहुत गन्दा हो जाता है - कोष्ठक की प्रचुरता) का उपयोग करके समतुल्य की तुलना में बहुत अधिक स्पष्ट है। यह बहुत अधिक कास्टिंग से बचा जाता है , और अधिक विशिष्ट मैचों के लिए सरल एक्सटेंशन (या तो सीधे या विस्तार विधियों के माध्यम से) की अनुमति देता है, उदाहरण के लिए एक इनरेंज (...) वीबी सिलेक्ट के लिए तुलनीय मैच ... केस "x to y “उपयोग।
मैं सिर्फ यह जानने की कोशिश कर रहा हूं कि क्या लोगों को लगता है कि उपर्युक्त (भाषा समर्थन के अभाव में) निर्माणों से बहुत लाभ है?
इसके अतिरिक्त ध्यान दें कि मैं ऊपर के 3 वेरिएंट्स के साथ खेल रहा हूं:
- एक फंक <TSource, मूल्यांकन के लिए TValue> संस्करण - समग्र ternary सशर्त बयानों के लिए तुलनीय
- एक क्रिया <TSource> संस्करण - अगर / वरना / if if / if if / else के बराबर है
- एक अभिव्यक्ति <Func <TSource, TValue >> संस्करण - पहले के रूप में, लेकिन मनमाने ढंग से LINQ प्रदाताओं द्वारा प्रयोग करने योग्य
इसके अतिरिक्त, एक्सप्रेशन-आधारित संस्करण का उपयोग एक्सप्रेशन-ट्री री-राइटिंग को सक्षम करता है, अनिवार्य रूप से सभी शाखाओं को बार-बार मंगलाचरण का उपयोग करने के बजाय एक एकल संमिश्र सशर्त अभिव्यक्ति में सम्मिलित करता है। मैंने हाल ही में जाँच नहीं की है, लेकिन कुछ शुरुआती एंटिटी फ्रेमवर्क में मुझे लगता है कि मुझे यह आवश्यक लगता है, क्योंकि यह InvocationExpression को बहुत पसंद नहीं करता था। यह LINQ-to-Objects के साथ अधिक कुशल उपयोग की भी अनुमति देता है, क्योंकि यह बार-बार डेलीगेट इनवोकेशन से बचता है - परीक्षण उपरोक्त मैच की तरह दिखाते हैं (एक्सप्रेशन फॉर्म का उपयोग करके) समान गति से प्रदर्शन [मामूली रूप से तेज, वास्तव में] समतुल्य सी # की तुलना में समग्र सशर्त कथन। पूर्णता के लिए, फंक <...> आधारित-संस्करण को C # सशर्त कथन के रूप में 4 बार लिया गया, लेकिन अभी भी बहुत जल्दी है और अधिकांश उपयोग के मामलों में एक बड़ी अड़चन होने की संभावना नहीं है।
मैं उपरोक्त किसी भी विचार / इनपुट / समालोचना / आदि का स्वागत करता हूं (या समृद्ध सी # भाषा समर्थन की संभावनाओं पर - यहां उम्मीद है- पीपी)।
switch-case
बयान। मुझे गलत मत समझो, मुझे लगता है कि इसकी जगह है और मैं शायद इसे लागू करने के लिए रास्ता तलाशूंगा।