2010-08-31 14 views
24

मैंने सी # जेनेरिक का उपयोग करके कुछ नमूना कोड देखा। मुझे उनका उपयोग कब और कब करना चाहिए?सी # जेनेरिक को समझना बहुत बेहतर

सभी उदाहरण जटिल थे। मुझे एक सरल, स्पष्ट उदाहरण चाहिए जो मुझे सी # जेनेरिक के साथ शुरू कर देता है।

+8

सी [इस सवाल] (http://stackoverflow.com/questions/77632/what-is-cool-about -generics-क्यों-उपयोग-उन्हें)। –

+0

देखें: http://www.csharp-station.com/Tutorials/Lesson20.aspx – kenorb

उत्तर

50

जेनरिक List<T> कक्षा एक बहुत ही सरल उदाहरण है। यह किसी भी प्रकार की कई वस्तुओं को पकड़ सकता है। उदाहरण के लिए, आप स्ट्रिंग्स (new List<string>()) या जानवरों की एक सूची (new List<Animal>()) की एक सूची घोषित कर सकते हैं, क्योंकि यह सामान्य है।

क्या होगा यदि आप जेनेरिक का उपयोग नहीं कर सके? आप ArrayList कक्षा का उपयोग कर सकते हैं, लेकिन नकारात्मकता यह है कि इसमें object है। तो जब आप सूची में पुन: प्रयास करेंगे, तो आपको प्रत्येक आइटम को अपने सही प्रकार (या तो string या Animal) पर डालना होगा जो अधिक कोड है और इसका प्रदर्शन जुर्माना है। इसके अलावा, ArrayList ऑब्जेक्ट्स रखता है, इसलिए यह टाइप-सुरक्षित नहीं है। तुम अब भी तार का एक ArrayList के लिए एक Animal जोड़ सकते हैं:

ArrayList arrayList = new ArrayList(); 
arrayList.Add(new Animal()); 
arrayList.Add(""); 

तो जब एक ArrayList पुनरावृत्ति आप बनाने के लिए प्रकार की जांच करना होगा यकीन है कि उदाहरण के एक विशेष प्रकार का है, जो गरीब कोड में जो परिणाम की है:

foreach (object o in arrayList) 
{ 
    if(o is Animal) 
    ((Animal)o).Speak(); 
} 
एक सामान्य List<string> साथ

, यह बस संभव नहीं है:

List<string> stringList = new List<String>(); 
stringList.Add("Hello"); 
stringList.Add("Second String"); 
stringList.Add(new Animal()); // error! Animal cannot be cast to a string 
+3

अच्छा जवाब। अनुसरण करने में आसान। एक अच्छा, साफ और गैर-जटिल उदाहरण देने में सक्षम होने के लिए – RKh

+0

+1। बहुत बढ़िया। – Subby

+0

अब है कि क्या हम भयानक उदाहरण के साथ, एक बुनियादी विवरण कहते हैं, वास्तविक समय कोड स्निपेट होने है। महान। +1 – Kings

0

संक्षेप में, जेनरिक आप वर्गों लिखने की अनुमति था किसी भी प्रकार की वस्तुओं के साथ काम नहीं करते हैं, लेकिन डेटा को Object पर डालने के बिना। इसके लिए प्रदर्शन लाभ हैं, लेकिन यह आपके कोड को और अधिक पठनीय, रखरखाव योग्य और कम त्रुटि-प्रवण बनाता है।

जब भी संभव हो तो आपको हमेशा .NET 1.1 शैली कक्षाओं के विपरीत जेनेरिक का उपयोग करना चाहिए।

5

कुछ बल देते हुए अन्य उत्तर संक्षेप में:

1) जेनरिक आप 'सामान्य' कोड (यानी, वह कई प्रकार के लिए काम करेगा) लिखने के लिए सक्षम करें। यदि आपके पास 'सामान्य' व्यवहार है जिसे आप लिखना चाहते हैं, जिसे आपको अलग-अलग डेटा प्रकारों के लिए व्यवहार करने की आवश्यकता है, तो आपको केवल उस कोड को एक बार लिखना होगा। सूची का उदाहरण एक महान उदाहरण है, तो आप शायद ग्राहकों, उत्पादों, आदेश, आपूर्तिकर्ताओं की सूची ... सभी एक ही कोड प्रत्येक प्रकार

// snippet 
List<Customer> customers = new List<Customer>(); 
Customer thisCustomer = new Customer(); 
customers.Add(thisCustomer); 

List<Order> orders = new List<Order>(); 
Order thatOrder = new Order(); 
orders.Add(thatOrder); 

// etc. 

2) आश्चर्यजनक के लिए instantiated का उपयोग कर, जेनेरिक्स अभी भी प्रकार सुरक्षा सक्षम की जरूरत है सकते हैं ! तो अगर आप इस प्रयास करने पर आपको ठीक ही कोई त्रुटि मिल जाएगा:

// continued for snippet above 
Order anotherOrder = new Order(); 
customers.Add(anotherOrder); // FAIL! 

और तुम इतना है कि बाद में अपने ग्राहकों के प्रसंस्करण कोड पर एक फर्जी आदेश में दिखाने को संभालने के लिए नहीं है कि, एक त्रुटि होने के लिए चाहते हैं ग्राहकों की सूची।

+0

अपडेट किया गया काश मैं ने कहा था कि क्या Unmesh ने कहा: "। दोहराव सब बुराई की जड़ है" – Jay

3

डुप्लिकेशन सभी बुराई की जड़ है। कोड डुप्लिकेशन का एक मामला तब होता है जब आपको विभिन्न प्रकार के डेटा पर एक ही ऑपरेशन करना होता है। जेनेरिक आपको 'जेनेरिक' प्रकार के आसपास कोड करने और बाद में विशिष्ट प्रकारों के साथ प्रतिस्थापित करने की अनुमति देकर इससे बचने देते हैं।

इस समस्या का अन्य समाधान 'System.Object' प्रकार के चर का उपयोग करना है, किसी भी प्रकार की वस्तु को असाइन किया जा सकता है। इस विधि में बॉक्सिंग और अनबॉक्सिंग ऑपरेशंस शामिल हैं जो मूल्य और संदर्भ प्रकारों के बीच प्रदर्शन करते हैं।कास्टिंग टाइप करें कोड को साफ होने से रोकता है।

जेनेरिक्स MSIL और CLR जो यह वास्तव में अच्छा प्रदर्शन करता है में समर्थित हैं।

आप जेनरिक के बारे में इन लेखों को पढ़ना चाहिए -

http://msdn.microsoft.com/en-us/library/512aeb7t(VS.80).aspx

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx#csharp_generics_topic1

+2

सभी बुराई की कई जड़ों हैं, जैसे समयपूर्व अनुकूलन और यहां तक ​​कि समयपूर्व सामान्यीकरण;) –

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