Thursday, November 4, 2021

C# Generics, its importance and dynamic keyword in Hindi

 


C# प्रोग्रामिंग के अंतर्गत जेनेरिक का उपयोग टाइप्सेफ प्रोग्रामिंग के लिए किया जाता है। हम जानते हैं कि C# एक टाइपसेफ प्रोग्रामिंग लैंग्वेज है परंतु C# एक बहुत ही लचीला प्रोग्रामिंग लैंग्वेज है जिसके कारण हम टाइप सेफ्टी के बिना भी कुछ स्थिति विशेष में प्रोग्रामिंग कर सकते हैं। उदाहरण के लिए C# के अंतर्गत System.Collections नेमस्पेस के भीतर जो विभिन्न प्रकार के क्लासेज जैसे ArrrayList, Hashtable हैं वे पूरी तरह टाइप्सेफ नहीं है। उदाहरण के लिए ArrayList और Hashtable के Add मेथड ऑब्जेक्ट टाइप के आइटम को add करते हैं। अतः यह पूरी तरह टाइपसेफ नहीं हैं। Syntax:

Add(Object item)

इसका मूल कारण यह है कि Add मेथड किसी ऑब्जेक्ट टाइप आइटम को add करने के लिए यूज किया जाता है। जैसा कि ऑब्जेक्ट किसी भी डाटाटाइप को रिप्रेजेंट करता है, अतः प्रोग्रामर द्वारा किसी भी डाटाटाइप के आइटम को Add मेथड के द्वारा ऐड किया जा सकता है। इससे टाइपसेफ्टी खत्म हो जाती है और यह टाइपसेफ्टी के दृष्टिकोण से एक बहुत बड़ी समस्या है। इसी समस्या को ध्यान में रखते हुए Generic की संकल्पना को C# में विकसित किया गया।

टाइपसेफ्टी के लिए C# के अंतर्गत जेनेरिक के लिए System.Collections.Generics नामक नेमस्पेस है। System.Collections.Generics नेमस्पेस के अंतर्गत ऐसे जेनेरिक क्लासेज हैं जो पूरी तरह टाइप्सेफ है। जैसे List<T>

यहाँ ब्रैकेट के बीच में T एक प्लेसहोल्डर का कार्य करता है जो बताता है की List क्लास किस प्रकार के डाटा को हैंडल करता है। प्रोग्रामर के द्वारा यह डाटाटाइप प्लेसहोल्डर में पास किया जाता है। जैसे List<int> यह इंगित करता है कि यह List क्लास केवल int डाटाटाइप के डाटा को हैंडल करता है।

जेनेरिक वस्तुतः एक ऐसी युक्ति है जो इसी क्लास, स्ट्रक्चर, मेथड, फील्ड, प्रॉपर्टी इत्यादि को एक ओर जहां Object टाइप की तरह टाइप की सामान्यता प्रदान करता है, वहीं दूसरी ओर यह टाइप्सेफ्टी भी प्रदान करता है। प्रोग्रामर जेनेरिक के टाइप को एक प्लेसहोल्डर की तरह यूज करता है और उस प्लेसहोल्डर को जो भी टाइप दिया जाता है वही टाइप उस जेनरिक का हो जाता है।

जेनेरिक का अभिप्राय ऐसे टाइप से है जो किसी खास टाइप का प्रतिनिधित्व नहीं करता हो बल्कि जेनेरिक टाइप ऐसा टाइप है जो प्रोग्रामर को यह सुविधा देता है कि वह किसी भी टाइप को ध्यान में रखते हुए जेनेरिक टाइप को यूज़ कर सकता है और तब जेनेरिक टाइप उस खास टाइप की तरह कार्य करने लगता है। यह बात हम आगे उदाहरण से स्पष्ट करेंगे।

यह भी बात याद रखने वाली है कि C# के अंतर्गत कोई क्लास, स्ट्रक्चर, इंटरफेस या क्लास का मेंबर जैसे फील्ड, प्रॉपर्टी, मेथड इत्यादि जेनेरिक हो सकता है। 

जेनेरिक क्लास और जेनेरिक मेथड के बारे में हम आगे सोदाहरण अध्ययन करेंगे।

सबसे पहले हम एक जेनेरिक क्लास का उदाहरण देखते हैं जिसके अंतर्गत एक जेनेरिक फील्ड Age यूज किया गया है। 

public class GenericClassA<T>

{

private T Age;

}

ध्यान दीजिए कि Age का डाटाटाइप T दिया गया है जो कि वास्तविक डाटाटाइप के लिए प्लेसहोल्डर का कार्य करता है। जेनेरिक क्लास को यूज करते समय प्रोग्रामर के द्वारा वास्तविक डाटाटाइप को प्लेसहोल्डर के भीतर दिया जाएगा। 

निम्नलिखित उदाहरण में Compare एक नन जेनेरिक मेथड है जबकि CompareG जेनेरिक मेथड है। जेनेरिक मेथड में पैरामीटर्स डाटाटाइप के प्लेसहोल्डरस है जबकि ननजेनेरिक मेथड का पैरामीटर Object डाटाटाइप का है। प्रोग्राम के कमेंट्स को ध्यान से पढ़िए और जेनेरिक मेथड और नन जेनेरिक मेथड के बीच के अंतर को समझें।

अब एक प्रश्न का उत्तर दीजिए- क्या जेनेरिक मेथड का रिटर्न टाइप जेनेरिक हो सकता है?

  
using System;

namespace GenericsDemo
{
    class GenericEx1
    {
        public bool Compare(Object a, Object b)
        {
            if (a.Equals(b))
                return true;
            return false;
        }
        public bool CompareG(T a, T b)
        {
            if (a.Equals(b))
                return true;
            return false;
        }
    }
}
using System;

namespace GenericsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Before using generic method:");
            GenericEx1 obj = new GenericEx1();
            Console.WriteLine(obj.Compare(10, 10));
            Console.WriteLine(obj.Compare(10, 10.0));
            Console.WriteLine(obj.Compare(10, 12));
            Console.WriteLine("After using generic method with implicit type:");
            Console.WriteLine(obj.CompareG(10, 10)); // implicit type is int
            Console.WriteLine(obj.CompareG(10, 10.0)); // implicit type is double
            Console.WriteLine(obj.CompareG(10, 12)); // implicit type is int
            Console.WriteLine("After using generic method:");
            Console.WriteLine(obj.CompareG(10, 10)); // explicit type is int
            //Console.WriteLine(obj.CompareG(10, 10.0)); // explicit type is int, error as 2nd argument is not int
            Console.WriteLine(obj.CompareG(10, 12)); // explicit type is int
            Console.ReadKey();
        }
    }
}


© अजीत कुमार, सर्वाधिकार सुरक्षित।

इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।

No comments:

Post a Comment

Hot Topics