2010-08-27 8 views
5

सी # 4.0 से बाहर आने से पहले, मैं कॉन्वर्सिस और contravariance के बारे में काफी उत्साहित था। यह सैद्धांतिक शुद्धता के लिए मेरे प्यार के लिए pandered!सी # 4.0 में कॉन्वर्सिस और contravariance के लिए अच्छे, वास्तविक जीवन के उपयोग के मामलों के उदाहरण?

हालांकि, अब यह बाहर है, और मैं सामान्य, रोज़ाना, उबाऊ कोड लिखने के लिए वापस आ गया हूं, मुझे आश्चर्य हो रहा है: क्या मैंने कभी इसका उपयोग किया है? और मैंने देखा कि मैंने इसे सख्ती से इस्तेमाल नहीं किया है। मैंने जो इंटरफेस या प्रतिनिधियों को परिभाषित किया है, उनमें से कोई भी इससे लाभान्वित नहीं हुआ है।

केवल एक ही मामला है, जिसमें मैं बाद में पता चला मैं अनजाने सहप्रसरण का इस्तेमाल किया है, लेकिन यह बहुत ही सूक्ष्म है और मैं साथ ही यह ध्यान नहीं दिया जा सकता था नहीं है। कल्पना कीजिए X एक आधार स्तरीय है और Y यह के वंशज है:

if (enumerableOfYs.Contains(variableOfTypeX)) 

वहाँ किसी भी दिलचस्प या रोमांचक उदाहरण हैं, जहां तुम लोगों में से किसी एक वास्तविक जीवन, गैर काल्पनिक use- में सहप्रसरण या contravariance का इस्तेमाल किया है कर रहे हैं मामला और यह वास्तव में शानदार "सही" होने से दिन बचा है?

+5

आपका मतलब है 'आईन्यूमेरेबल ', 'Func', और 'IComparable ' जैसी चीजों के अलावा आप शायद इसे महसूस किए बिना रोज़ाना उपयोग करते हैं? – Gabe

उत्तर

8

विचरण के केवल "वास्तविक दुनिया" उपयोग है कि मैं (के रूप में संकलक परीक्षण मामलों या लेख या जो कुछ भी लिख के खिलाफ) अपने वास्तविक लेखन-कार्यक्रमों के लिए ग्राहकों में आई है मैं अब के लिए एक IEnumerable<TypeParameterDefinedInSource> से पारित सकता है एक विधि जो IEnumerable<TypeSymbol> की अपेक्षा करती है जब मैं सी # में कोड विश्लेषण उपकरण लिखता हूं।

यह वास्तव में "दिन को बचाने" सुविधा नहीं है। यह एक "यह काम करता है जिस तरह से मैं इसे उम्मीद करता हूं" सुविधा है।

+0

हाय, एरिक। आपके उत्तर के लिए धन्यवाद। इससे मुझे एक और सामान्य सवाल होता है हालांकि: सी # टीम विशेषताएं कैसे प्राथमिकता देती है? यह कैसे एक सुविधा है जो "दिन को बचाने" नहीं करती है, उन सुविधाओं की तुलना में बहुत अधिक प्राथमिकता प्राप्त करती है जो * * "दिन को बचाने" * और * चीजों को "जिस तरह से मैं उम्मीद करता हूं" काम करता हूं? (उदाहरण के लिए जेनेरिक कस्टम एट्रिब्यूट्स, गुमनाम इटेटरेटर ब्लॉक इत्यादि) – Timwi

+3

@ तिमवी: हम प्रतिस्पर्धी मानदंडों की एक लंबी सूची के आधार पर सुविधाओं को प्राथमिकता देते हैं, जिसमें कार्यान्वयन की कठिनाई, यह कितनी अच्छी तरह से काम करता है या अन्य सुविधाओं के खिलाफ काम करता है, चाहे वह फिट हो रिलीज के लिए व्यापक विषय, और इसी तरह। भिन्नता आसान थी; हम जानते थे कि इसे कैसे कार्यान्वित किया जाए, यह पहले ही सीएलआर में समर्थित था, हम सिद्धांत को बहुत अच्छी तरह समझते हैं और इसने हर समय एक वास्तविक ग्राहक समस्या को हटा दिया है। एक बड़ी सुविधा ने "गतिशील" काम करने से बहुत सारे संसाधनों को हटा दिया होगा जो रिलीज के लिए उच्च आदेश बिट था। –

+0

मुझे लगता है कि "यह एक और अधिक है" यह जिस तरह से मैं इसे "फीचर" की अपेक्षा करता हूं, वह जिस तरह से उपयोगी है, वह महत्वपूर्ण है। –

1

कॉन्वर्सिस और contravariance जैसी विशेषताएं वास्तव में "दिन को बचाने" नहीं है। इसके बजाय, जब सही ढंग से उपयोग किया जाता है, तो वे बाद में रखरखाव को आसान बनाते हैं। इस तरह, यह सी ++ में कॉन्स शुद्धता की तरह है। यह कोई शक्ति नहीं जोड़ता है, लेकिन लिखा गया कोड सही ढंग से इसका उपयोग करता है और यह सिस्टम को काम करने में बहुत आसान बनाता है।

नोट: मैं इसे अभी तक का इस्तेमाल किया है इसलिए नहीं कि मैं सिर्फ वी.एस. 2010

+0

एचएम, मैं असहमत हूं। सी ++ में कॉन्स एक प्रतिबंध है। कॉन्वर्सिस/contravariance विपरीत है, यह एक अतिरिक्त क्षमता है। – Timwi

+0

@Timwi, हाँ यह एक अच्छा मुद्दा है। यह बहुत मूल्य जोड़ता है। मैं गलत था। – tster

0

करने के लिए उन्नत मैं के बारे में तीन साल के लिए सी # का इस्तेमाल किया है, और मैं केवल विचरण शायद एक या दो बार की सुविधा है याद कभी "लापता"।

यह है कि अब यह है कि वे भाषा में हैं, मैं उनमें से लाभ लेने के लिए और अधिक अवसर मिल जाएगा संभव है, लेकिन मैं वे 'नाबालिग' कर रहे हैं लगता है कि सबसे अच्छे रूप में पेश करता है।

(मैं दूसरों जवाब यहां क्या प्रकट होते देखना इच्छुक हूँ।)

3

मैं एरिक Lippert, सुविधा के डिजाइनरों में से एक द्वारा सहप्रसरण और contravariance पर उत्कृष्ट दो भाग वीडियो श्रृंखला देखी। वीडियो में सबसे स्पष्ट स्पष्टीकरण है जो मैं पा सकता हूं कि सुविधा कैसे काम करती है; हालांकि, प्रदर्शन के लिए उदाहरण सामने आए हैं।

मैं विशेष रूप से दूसरा वीडियो के अंत में एरिक की चर्चा की सराहना के बारे में जब वह उम्मीद उपयोगकर्ताओं सुविधा का उपयोग होगा। उन्होंने संकेत दिया कि रेखा का व्यापार सबसे एप्लिकेशन डेवलपर शायद सहप्रसरण या contravariance रोजगार कई इंटरफेस का निर्माण नहीं होगा, लेकिन यह है कि यह अधिक संभावना है (बेशक अपने स्वयं के चौखटे सहित) एक रूपरेखा डेवलपर की भूमिका है।

दूसरी तरफ, मैं अंततः IEnumerable<DerivedClass> को IEnumerable<BaseClass> की अपेक्षा करने वाली विधि में टाइपिंग कास्टिंग हुप्स के माध्यम से कूदने के बिना रख सकता हूं। आखिरकार, मैं शायद भूल जाऊंगा कि मैं कभी नहीं कर सका। मुझे लगता है कि इस सहप्रसरण/contravariance का सबसे सम्मोहक और आम उपयोग होगा: सुपर सूक्ष्म चीजें हैं जो बस काम जब, नेट के पुराने संस्करणों में, उन्होंने ऐसा नहीं किया।

संबंधित मुद्दे