जेनरिक्स
जेनरिक्स (Generics) C# में एक शक्तिशाली फीचर है जो डेवलपर्स को ऐसा कोड लिखने की अनुमति देता है जो विभिन्न डेटा प्रकारों के साथ काम कर सकता है, बिना रनटाइम पर टाइप सुरक्षा खोए। जेनरिक्स का उपयोग करने से कोड पुन: प्रयोज्य, सुरक्षित और मेंटेन करने योग्य बनता है। यह विशेष रूप से कलेक्शन जैसे List
C# में जेनरिक्स का उपयोग तब किया जाता है जब आपको एक ही लॉजिक को विभिन्न डेटा प्रकारों के लिए लागू करना हो। इससे कोड डुप्लीकेशन कम होता है और टाइप कास्टिंग की आवश्यकता घटती है। जेनरिक्स के साथ, डेवलपर OOP सिद्धांतों, डेटा स्ट्रक्चर्स और एल्गोरिदम को अधिक कुशलता से लागू कर सकता है।
इस ट्यूटोरियल में, पाठक सीखेंगे कि कैसे जेनरिक क्लासेस और मेथड्स बनाई जाती हैं, टाइप कॉन्स्ट्रेंट्स लागू किए जाते हैं और जेनरिक्स का उपयोग वास्तविक C# प्रोजेक्ट्स में कैसे किया जा सकता है। साथ ही, यह समझाया जाएगा कि जेनरिक्स सॉफ़्टवेयर आर्किटेक्चर में कैसे मॉड्यूलरिटी और परफॉर्मेंस बढ़ाते हैं।
मूल उदाहरण
textusing System;
namespace GenericsDemo
{
// जेनरिक क्लास की परिभाषा
public class Box<T>
{
private T content;
public void Add(T item)
{
content = item;
}
public T Get()
{
return content;
}
}
class Program
{
static void Main(string[] args)
{
// int प्रकार के लिए जेनरिक क्लास
Box<int> intBox = new Box<int>();
intBox.Add(42);
Console.WriteLine("Box में सामग्री: " + intBox.Get());
// string प्रकार के लिए जेनरिक क्लास
Box<string> stringBox = new Box<string>();
stringBox.Add("नमस्ते दुनिया");
Console.WriteLine("Box में सामग्री: " + stringBox.Get());
}
}
}
इस उदाहरण में BoxAdd
और Get
मेथड्स कंटेंट को जोड़ने और प्राप्त करने के लिए उपयोग की जाती हैं। Main में Box
यह कोड टाइप सुरक्षा सुनिश्चित करता है क्योंकि कंपाइलर यह जांचता है कि केवल निर्दिष्ट टाइप का उपयोग किया जाए। जेनरिक्स का यह उपयोग कोड पुन: प्रयोज्यता बढ़ाता है, कास्टिंग की आवश्यकता कम करता है और रनटाइम एरर्स से बचाता है।
व्यावहारिक उदाहरण
textusing System;
using System.Collections.Generic;
namespace AdvancedGenericsDemo
{
// जेनरिक रिपॉज़िटरी क्लास टाइप कॉन्स्ट्रेंट के साथ
public class Repository<T> where T : class
{
private List<T> items = new List<T>();
public void Add(T item)
{
if (item == null)
throw new ArgumentNullException(nameof(item), "Item null नहीं हो सकता");
items.Add(item);
}
public T Find(Predicate<T> predicate)
{
return items.Find(predicate);
}
public void DisplayAll()
{
foreach (var item in items)
{
Console.WriteLine(item.ToString());
}
}
}
class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
public override string ToString()
{
return $"{Name} - {Price} ₹";
}
}
class Program
{
static void Main(string[] args)
{
Repository<Product> productRepo = new Repository<Product>();
productRepo.Add(new Product { Name = "Laptop", Price = 70000 });
productRepo.Add(new Product { Name = "Smartphone", Price = 40000 });
Console.WriteLine("सभी उत्पाद:");
productRepo.DisplayAll();
Product expensiveProduct = productRepo.Find(p => p.Price > 50000);
Console.WriteLine("सबसे महंगा उत्पाद: " + expensiveProduct);
}
}
}
इस उदाहरण में Repositorywhere T : class
है, जो केवल रेफरेंस टाइप्स को अनुमति देता है। Add
, Find
और DisplayAll
मेथड्स डेटा को सुरक्षित और कुशलता से हैंडल करती हैं। Null चेकिंग के साथ एरर हैंडलिंग की गई है।
Product क्लास एक वास्तविक ऑब्जेक्ट को दर्शाती है और ToString ओवरराइड कर उपयोग को सरल बनाती है। Main में Repository
C# में जेनरिक्स के लिए Best Practices और सामान्य गलतियाँ:
- टाइप कॉन्स्ट्रेंट्स का उपयोग करके सही टाइप्स की अनुमति दें।
- जेनरिक कंटेनर्स में unmanaged resources स्टोर करने से बचें।
- इनबिल्ट जेनरिक कलेक्शन्स (List
, Dictionary\ ) का उपयोग करें। - Null या invalid इनपुट के लिए exception handling करें।
- जेनरिक्स को अनावश्यक रूप से सामान्य न बनाएं।
- Debugging के दौरान actual types पर ध्यान दें।
- Performance बढ़ाने के लिए Boxing/Unboxing को कम करें।
- Security के लिए इनपुट वैलिडेशन करें और संवेदनशील डेटा सुरक्षित रखें।
📊 संदर्भ तालिका
C# Element/Concept | Description | Usage Example |
---|---|---|
जेनरिक क्लास | क्लास जो कई प्रकारों को संभाल सकती है | public class Box<T> { T content; } |
जेनरिक मेथड | मेथड जो विभिन्न प्रकारों के लिए काम करती है | public T GetItem<T>(T item) { return item; } |
Constraints | क्लास पर टाइप सीमाएँ लागू करना | where T : class, new() |
List<T> | जेनरिक लिस्ट कलेक्शन | List<int> numbers = new List<int>(); |
Dictionary\<TKey,TValue> | की-वैल्यु कलेक्शन | Dictionary\<string,int> ages = new Dictionary\<string,int>(); |
Predicate<T> | एलीमेंट सर्च या फिल्टरिंग के लिए delegate | items.Find(p => p.Price > 50000); |
सारांश और अगले कदम:
जेनरिक्स C# में कोड को सुरक्षित, पुन: प्रयोज्य और performant बनाने का तरीका है। जेनरिक क्लासेस, मेथड्स, कलेक्शन्स और constraints का सही उपयोग करके जटिल डेटा प्रोसेसिंग और एल्गोरिदम को implement किया जा सकता है। यह modular और maintainable architecture को बढ़ावा देता है और runtime errors को कम करता है।
आगे सीखने के लिए Stack
🧠 अपने ज्ञान की परीक्षा करें
अपना ज्ञान परखें
व्यावहारिक प्रश्नों के साथ इस विषय की अपनी समझ का परीक्षण करें।
📝 निर्देश
- हर प्रश्न को ध्यान से पढ़ें
- हर प्रश्न के लिए सबसे अच्छा उत्तर चुनें
- आप जितनी बार चाहें क्विज़ दोबारा दे सकते हैं
- आपकी प्रगति शीर्ष पर दिखाई जाएगी