2009-02-28 8 views
11

क्या सबसे महत्वपूर्ण चीजें आप जेनरिक के बारे में पता कर रहे हैं: छिपा सुविधाओं, आम गलतियों, सबसे अच्छा और सबसे उपयोगी प्रथाओं, टिप्स ...के बारे में सी # जेनरिक ... सबक सबसे महत्वपूर्ण कुछ सीखा

मैं सबसे लागू करने के लिए शुरू कर रहा हूँ जेनेरिक का उपयोग करके मेरी लाइब्रेरी/एपीआई का और अभ्यास में पाए जाने वाले सबसे आम पैटर्न, टिप्स इत्यादि एकत्र करना चाहते हैं।

मुझे प्रश्न को औपचारिक रूप देने दें: जेनेरिक के बारे में आपने जो सबसे महत्वपूर्ण बात सीखी है, वह क्या है? , के रूप में जटिल और वह बहुत शुष्क विवरण के

धन्यवाद

इस सवाल का विरोध किया यह समझने के लिए आसान होगा है कुछ हद तक Jon's question के समान हालांकि, एक पर -

उदाहरण प्रदान करने का प्रयास करें अलग विषय

+0

समुदाय विकी ?! –

+0

यह एक सीडब्ल्यू –

+0

होना चाहिए अफशारी से सहमत: कोई भी स्वीकृत उत्तर विभिन्न पदों का एकीकरण होगा, और उस उद्देश्य के लिए विकी किया जाना चाहिए। इस मामले को बंद करने के लिए वोटिंग; प्रश्न का ट्रैक रखने के लिए अनुकूल है। –

उत्तर

14

मैंने सीखा सबसे महत्वपूर्ण चीजों में से एक यह है कि आप constrain the generic type parameter(s) कर सकते हैं। यह बहुत शक्तिशाली हो सकता है, जिससे आप केवल कुछ प्रकार की वस्तुओं के लिए कक्षा को अनुकूलित कर सकते हैं और आपको अपने सामान्य वर्ग में उस प्रकार के सदस्यों का उपयोग करने की अनुमति दे सकते हैं। मुझे एहसास है कि यह बहुत मौलिक है, लेकिन यह उन चीजों में से एक है जो जेनेरिक को अविश्वसनीय रूप से उपयोगी बनाता है।

3

सी # में जेनेरिक प्रकार अनुमान की क्षमताओं और सीमाओं को समझें। कंपाइलर क्या कर सकता है, और नहीं कर सकता है, आपकी विधि में पैरामीटर के प्रकार (उदा।) के आधार पर अनुमान लगाया जा सकता है ताकि आपके एपीआई के सामान्य उपयोग-मामलों को और अधिक पठनीय बनाने के लिए लीवरेज किया जा सके।

+1

कृपया एक उदाहरण प्रदान करें .... मैं इसे क्रिया में देखना चाहता हूं –

+0

अधिकांश LINQ एक उदाहरण है, वास्तव में। :) जेनेरिक एपीआई के टोन, लेकिन ध्यान दें कि इसका उपयोग करते समय आपको वास्तव में किसी प्रकार को वास्तव में निर्दिष्ट नहीं करना पड़ता है। –

3

जेनेरिकों के बारे में मैंने सबसे महत्वपूर्ण सबक सीखा है: जितना अधिक आप उनका बेहतर उपयोग करेंगे।

0

सबसे पहले यह जानना महत्वपूर्ण है कि जेनिक्स सी # में कैसे काम करता है। यह article आपको एंडर्स हेजल्सबर्ग (सी # के पिता) द्वारा जेनेरिक का एक अच्छा अवलोकन देता है। मुझे नहीं लगता कि जितनी बार संभव हो सके उनका उपयोग करना अच्छा है। जेनिक्स का प्रयोग करें जब वे वास्तव में समझ में आते हैं। चरम प्रोग्रामिंग से हमेशा केआईएसएस और याग्नी को याद रखें (इसे सरल बेवकूफ रखें; आपको इसकी आवश्यकता नहीं है)।

0

जेनेरिक प्रतिनिधि प्रकार हमेशा invariant टाइप करते हैं।

मैं दूसरे दिन के नीचे दिए गए लिंक पर उल्लिखित एक मुद्दे में भाग गया, और इससे कुछ भ्रम पैदा हुआ क्योंकि मुझे समझ में नहीं आया कि मुझे अपना संग्रह क्यों डालना पड़ा।

http://www.theserverside.net/blogs/thread.tss?thread_id=47323

4

एक सामान्य प्रकार से प्रत्येक विशेषज्ञता एक अद्वितीय प्रकार के रूप में इलाज जब यह स्थिर सदस्यों तरह बातें करने के लिए आता है।उदाहरण के लिए, इस प्रकार के साथ:

class GenericType<T> 
{ 
    public static int SomeValue; 
} 

ज़ोर सफल होता है हम ऐसा करते हैं:

GenericType<int>.SomeValue = 3; 
Debug.Assert(GenericType<double>.SomeValue == 0); 

इसका कारण यह है:

typeof(GenericType<int>) != typeof(GenericType<double>) 

हालांकि

typeof(GenericType<int>.GetGenericTypeDefinition() == typeof(GenericType<double>).GetGenericTypeDefinition() 
1

डॉन पता नहीं है कि वे सबसे महत्वपूर्ण हैं, लेकिन मेरे पास है निम्नलिखित सीखा:

जेनिक्स केवल फ्रिककिन प्रकार को नहीं जानते हैं, तो प्रतिबिंब के माध्यम से तत्काल तत्काल होगा। कुछ मामलों में आपको ऐसी सामान्य स्थितियों में अपने जेनेरिक कक्षाओं का उपयोग करने के लिए गैर-जेनेरिक इंटरफेस की आवश्यकता हो सकती है जहां प्रकार अज्ञात है।

मैं लगभग मेरे सिर बर्बाद जब तक मैं grocked कि

public class Foo<T> where T : Foo<T> { 
    public T CloneMe() ... 
} 

पूरी तरह से वैध कोड है और अपने आधार वर्ग के तरीकों और विशेष वर्ग ... कि एक की एक परिभाषा में समाप्त हो गया से संबंधित गुणों का पर्दाफाश करने के लिए अनुमति देता है राज्य मशीन अपने राज्यों के साथ:

public abstract class Machine<S,M> where S : State<S,M> where M : Machine<S,M> { 
    protected S state; 
} 

public abstract class State<S,M> where S : State<S,M> where M : Machine<S,M> { 
    protected M machine; 
} 

जेनिक्स थोड़ा अनावश्यक हो सकता है। दूसरे दिन मैं इस किया था:

List<Tuple<Expression<Func<DataTable,object>>,Expression<Func<DataTable,object>>>> 

ओफ़्फ़ ...

+0

अच्छी चीजें - इसे आते रहें! –

+0

अंतिम कोड स्निपेट के संबंध में, मेरे पास कुछ महीने पहले कुछ समान था। मैंने इसे किसी चीज में थोड़ा सा सरल और पठनीय करने के लिए दोबारा प्रतिक्रिया दी। – dotnetdev

+0

@ जीएसएस - यही मैंने भी किया है। यह सिर्फ बहुत पठनीय नहीं है। मैं इसके लिए ट्यूपल से लिया गया। अभी मैंने इसे दोबारा दोबारा दोहराया क्योंकि यह पता चला है कि कक्षा को अधिक अर्थशास्त्र की जरूरत है :) यह एक डेवलपर बनने के लिए एक मजेदार जीवन है, हमेशा movin '! – flq

1
MyGeneric<T> where T : IComparable 

MyGeneric<IComparable> 

इसके बारे में एक आधार वर्ग नहीं है।

+0

अच्छा, हालांकि मैंने इसे सीखा है, मूल रूप से, सी ++ –

1

मैंने सीखा है कि जेनेरिक अप्रत्यक्ष शक्तिशाली उपकरण है जिसका अभी तक दुरुपयोग किया गया है, बहुत ही अपठनीय कोड की ओर जाता है।

2

कोई कॉन्वर्सिस या कॉन्ट्रैक्ट-वेरिएंस (कम से कम 3.5 में)। क्लास पदानुक्रमों को डिजाइन करते समय इस बारे में जागरूक रहें जिनमें सामान्य प्रकार पैरामीटर शामिल हैं।

+1

से यह अंत में है, बेबी! यह भी ध्यान रखें कि सीएलआर के पास पहले से ही इसके लिए कुछ समर्थन था (आईएल में + और एनोटेशन के साथ), लेकिन भाषाओं और कंपाइलर्स ने इसके लिए वाक्यविन्यास प्रदान नहीं किया था। –

+0

मैं वास्तव में पेश किए गए भिन्नता में निराश था। मुझे लगता है कि ठीक क्या है, लेकिन काफी दूर नहीं जाता है। –

2

दो दिलचस्प सबक। प्रथम; सूचियों के साथ; T के संदर्भ में सोचने का प्रयास करें; for full details see here, लेकिन संक्षेप में आप का उपयोग करने की आवश्यकता है:

public void Foo<T>(IList<T> data) where T : SomeBaseClassOrInterface {} 

और नहीं:

public void Foo(IList<SomeBaseClassOrInterface> data) {} 

दूसरा: watch for the edge cases ;-p

आप यहाँ जाल देख सकते हैं?

static void Foo<T>() where T : new() 
{ 
    T t = new T(); 
    Console.WriteLine(t.ToString()); // works fine 
    Console.WriteLine(t.GetHashCode()); // works fine 
    Console.WriteLine(t.Equals(t)); // works fine 

    // so it looks like an object and smells like an object... 

    // but this throws a NullReferenceException... 
    Console.WriteLine(t.GetType()); // BOOM!!! 
} 
+0

मार्क, बूम भाग की व्याख्या करें? क्या यह इस तथ्य के कारण है कि टी एक मूल्य प्रकार हो सकता है - और GetType इसके लिए उपलब्ध नहीं है? –

+0

लिंक 'किनारे के मामलों के लिए घड़ी' देखें – johnc

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