C# में Generics: शुरुआती लोगों के लिए क्यों ज़रूरी हैं और कैसे उपयोग करें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C# में Generics: क्यों ज़रूरी हैं और कैसे उपयोग करें

\n\n

C# में विकास करते समय, देर-सबेर हर किसी को ऐसी स्थिति का सामना करना पड़ता है जहाँ एक ही एल्गोरिदम को विभिन्न डेटा प्रकारों पर लागू करने की आवश्यकता होती है। पहले, इसके लिए या तो एक ही विधि के कई संस्करण लिखने पड़ते थे, या object प्रकार का उपयोग करना पड़ता था, जिससे प्रदर्शन में कमी और त्रुटियों का जोखिम होता था। इस समस्या का समाधान है — Generics (सामान्यीकृत प्रकार)। इस लेख में, हम समझेंगे कि generics क्या हैं, वे क्यों ज़रूरी हैं और C# में उनका सही उपयोग कैसे करें।

\n\n

C# में Generics क्या हैं?

\n\n

Generics (सामान्यीकरण) C# भाषा का एक तंत्र है जो आपको क्लास, विधियाँ, इंटरफ़ेस और डेलिगेट बनाने की अनुमति देता है जो विभिन्न डेटा प्रकारों के साथ काम करते हैं, बिना सख्त टाइपिंग खोए। प्रत्येक प्रकार के लिए अलग-अलग कोड लिखने के बजाय, आप एक सार्वभौमिक टेम्पलेट बनाते हैं जो संकलन के समय आवश्यक प्रकार को प्रतिस्थापित करता है।

\n\n

कल्पना करें कि आपको दो वेरिएबल के मानों को आपस में बदलने के लिए एक विधि लिखनी है। Generics के बिना, आपको int, string, double आदि के लिए अलग-अलग विधियाँ बनानी होंगी। Generics के साथ, आप एक विधि लिखते हैं जो किसी भी प्रकार के साथ काम करती है।

\n\n

यहाँ एक generic-विधि घोषित करने का सबसे सरल उदाहरण है:

\n\n
public void Swap<T>(ref T a, ref T b)\n{\n    T temp = a;\n    a = b;\n    b = temp;\n}
\n\n

यहाँ <T> प्रकार का पैरामीटर है। अक्षर T एक सामान्यतः स्वीकृत संकेतन है (Type से), लेकिन आप कोई भी नाम उपयोग कर सकते हैं। जब आप विधि को कॉल करते हैं, तो आप एक विशिष्ट प्रकार निर्दिष्ट करते हैं:

\n\n
int x = 5, y = 10;\nSwap<int>(ref x, ref y);\n// अब x = 10, y = 5\n\nstring first = "Hello", second = "World";\nSwap<string>(ref first, ref second);\n// अब first = "World", second = "Hello"
\n\n

Generics क्यों ज़रूरी हैं: मुख्य लाभ

\n\n

Generics का उपयोग कई महत्वपूर्ण लाभ प्रदान करता है जो कोड को बेहतर और सुरक्षित बनाते हैं।

\n\n

1. प्रकार सुरक्षा (Type Safety)

\n

object के उपयोग के विपरीत, generics संकलन चरण में प्रकारों की जाँच करते हैं। आप गलती से वहाँ स्ट्रिंग नहीं भेज सकते जहाँ संख्या की अपेक्षा है। कंपाइलर तुरंत त्रुटि बताएगा।

\n\n

2. प्रदर्शन

\n

object का उपयोग करते समय, मान प्रकारों (int, double, struct) का संदर्भ प्रकार में बॉक्सिंग (boxing) और वापस अनबॉक्सिंग (unboxing) होता है। ये महँगी प्रक्रियाएँ हैं। Generics इन प्रक्रियाओं को पूरी तरह से समाप्त कर देते हैं, क्योंकि कंपाइलर प्रत्येक प्रकार के लिए विशेष कोड उत्पन्न करता है।

\n\n

3. कोड का पुन: उपयोग

\n

आपको विभिन्न प्रकारों के लिए एक ही एल्गोरिदम लिखने की आवश्यकता नहीं है। एक generic-क्लास या विधि हजारों विभिन्न प्रकारों के साथ काम कर सकती है।

\n\n

4. पठनीयता और रखरखाव

\n

कोड साफ और समझने में आसान हो जाता है। आप स्पष्ट रूप से देख सकते हैं कि विधि या क्लास किन प्रकारों के साथ काम करती है, और तर्क विशिष्ट डेटा प्रकारों से अलग होता है।

\n\n

Generics का उपयोग कैसे करें: व्यावहारिक उदाहरण

\n\n

आइए C# में generics के कुछ वास्तविक उपयोग परिदृश्यों पर नज़र डालें।

\n\n

Generic-क्लासेस

\n

सबसे सामान्य उदाहरण कलेक्शन हैं। संख्याओं, स्ट्रिंग्स या उपयोगकर्ता ऑब्जेक्ट्स की सूची संग्रहीत करने के लिए अपनी क्लास बनाने के बजाय, आप List<T> का उपयोग करते हैं:

\n\n
List<int> numbers = new List<int>();\nnumbers.Add(1);\nnumbers.Add(2);\n\nList<string> names = new List<string>();\nnames.Add("Alice");\nnames.Add("Bob");\n\n// आपकी अपनी generic-क्लास\npublic class Repository<T>\n{\n    private List<T> _items = new List<T>();\n\n    public void Add(T item) => _items.Add(item);\n    public T Get(int index) => _items[index];\n}\n\nRepository<int> intRepo = new Repository<int>();\nintRepo.Add(100);\nint value = intRepo.Get(0); // 100
\n\n

Generic-विधियाँ

\n

सामान्य क्लास के अंदर भी विधियाँ सामान्यीकृत हो सकती हैं:

\n

ब्लॉग

पुस्तक अनुशंसाएँ