जेनरिक को C# के संस्करण 2.0 में जोड़ा गया था और यह भाषा की सबसे महत्वपूर्ण अवधारणाओं में से एक है। वे आपको पुन:प्रयोज्य, उच्च-प्रदर्शन कोड लिखने में सक्षम करते हैं जो संकलन समय पर टाइप-सुरक्षित है। जेनरिक का उपयोग करके, आप अपने कोड के बारे में पहले से जाने बिना एक प्रकार का उपयोग कर सकते हैं।
.NET में कई जगहों पर जेनरिक का उपयोग किया जाता है, जिसमें संग्रह, प्रतिनिधि और एसिंक्रोनस कोड शामिल हैं। जेनरिक के साथ, आपको संग्रह के आकार को पहले से जानने की आवश्यकता नहीं है, और आप किसी भी तत्व प्रकार के साथ जेनरिक का उपयोग कर सकते हैं, यहां तक कि आपके कोड के लिए विशिष्ट कस्टम डेटा प्रकार भी। C# सामान्य प्रकार (वर्ग, इंटरफेस, आदि) और सामान्य तरीकों दोनों के लिए समर्थन प्रदान करता है।
जेनरिक में, आपके पास पैरामीटर टाइप करें और तर्क टाइप करें। यह उस विधि के समान है जिसमें पैरामीटर होते हैं, और आप विधि को तर्क देते हैं।
सामान्य प्रकार
एक सामान्य प्रकार घोषित करने के लिए सिंटैक्स में प्रकार के नाम के बाद कोण कोष्ठक में प्रकार पैरामीटर होते हैं। उदाहरण के लिए, लोकेटर
public class Locator<T> { }
Locator
var stringLocator = new Locator<string>();
जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है, आप वर्ग विधियों पर टाइप पैरामीटर (T) का उपयोग कर सकते हैं।
public class Locator<T>{ public IList<T> Items { get; set; } public T Locate(int index){ return Items[index]; } } var stringLocator = new Locator<string>(); string item = stringLocator.Locate(2);
जेनरिक का एक अतिरिक्त लाभ संपादक द्वारा प्रदान किया गया IntelliSense है। जब आप विजुअल स्टूडियो या वीएस कोड में stringLocator.Locate(4) टाइप करते हैं और मेथड के नाम पर होवर करते हैं; यह आपको दिखाएगा कि यह टी के बजाय एक स्ट्रिंग देता है। यदि आप स्ट्रिंग के अलावा किसी अन्य प्रकार के परिणाम को असाइन करने का प्रयास करते हैं, तो संकलक एक त्रुटि उठाएगा। उदाहरण के लिए,
// Error: Cannot implicitly convert type 'string' to 'int' [c-sharp]csharp(CS0029) int item = stringLocator.Locate(2);
जेनेरिक बेस टाइप या जेनेरिक इंटरफेस से इनहेरिट करते समय एक सामान्य प्रकार टाइप पैरामीटर को टाइप तर्क के रूप में उपयोग कर सकता है। सामान्य LinkedList
public class LinkedList<T> : IEnumerable<T>
सामान्य तरीके
एक सामान्य विधि केवल एक विधि है जो एक प्रकार के पैरामीटर की घोषणा करती है जिसे आप विधि के अंदर और पैरामीटर और रिटर्न प्रकार के रूप में उपयोग कर सकते हैं। नीचे दिए गए उदाहरण में, Swap
public class Swapper{ public T Swap<T>(T first, T second){ T temp = first; first = second; second = temp; return temp; } }
सामान्य प्रकारों की तरह, जब आप एक सामान्य विधि का आह्वान करते हैं, तो यह एक जोरदार टाइप किया गया चर लौटाएगा।
var swapper = new Swapper(); int result = swapper.Swap<int>(5, 3);
कई सामान्य पैरामीटर होना संभव है। System.Collections.Generic नेमस्पेस में डिक्शनरी क्लास में कुंजी और मान के लिए दो प्रकार के पैरामीटर हैं।
public class Dictionary<TKey, TValue>
अंत में, यह जानना महत्वपूर्ण है कि सामान्य क्या हो सकता है। प्रकार के लिए, एनम को छोड़कर, सब कुछ सामान्य हो सकता है। इसमें शामिल हैं -
- कक्षाएं
- संरचनाएं
- इंटरफ़ेस
- प्रतिनिधि
प्रकार के सदस्यों के लिए, केवल विधियाँ और नेस्टेड प्रकार सामान्य हो सकते हैं। निम्नलिखित सदस्य सामान्य नहीं हो सकते -
- फ़ील्ड
- गुण
- सूचकांक
- निर्माता
- इवेंट
- फाइनलाइज़र
उदाहरण
using System; using System.Collections.Generic; class Program{ static void Main(){ var stringLocator = new Locator<string>(){ Items = new string[] { "JavaScript", "CSharp", "Golang" } }; string item = stringLocator.Locate(1); Console.WriteLine(item); // CSharp var swapper = new Swapper(); int a = 5, b = 3; int result = swapper.Swap<int>(ref a, ref b); Console.WriteLine($"a = {a}, b = {b}"); } } public class Locator<T>{ public IList<T> Items { get; set; } public T Locate(int index){ return Items[index]; } } public class Swapper{ public T Swap<T>(ref T first, ref T second){ T temp = first; first = second; second = temp; return temp; } }
आउटपुट
CSharp a = 3, b = 5