Generics in C#

C# in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C#.NET in Hindi | Page:908 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE

Generics in C#: Generics C# का सबसे ज्यादा Powerful Feature और C# का एक बहुत ही महत्वपूर्ण हिस्सा है। इसे C# 2.0 में Add किया गया था। Generics की वजह से C# में कई नई Capabilities Add हो गई हैं, जिनके कारण C# एक और ज्यादा Powerful Language बन गया है।

Generics इसलिए काफी महत्वपूर्ण है क्योंकि इसकी वजह से हम ऐसी Classes, Structures, Interfaces, Methods Delegates Create करने की क्षमता प्राप्त कर लेते हैं, जो कि विभिन्न प्रकार के Data के लिए Type-Safe तरीके से काम करते हैं।

जैसाकि हम जानते हैं कि Algorithms सामान्‍यत: सभी प्रकार के Data Types के लिए समान होते हैं। उदाहरण के लिए हम दो Integer Values की Swapping करें या दो Floating Point Values की, Swapping करने का Algorithm समान ही होता है। लेकिन जब हम Syntactically देखते हैं, तो Integer की Swapping के लिए हमें अलग Syntax का प्रयोग करना पडता है, जबकि Floating Point Values के लिए अलग तरह का। यानी समान Algorithm के Implementation के लिए भी हमें अलग-अलग Codes लिखने पडते हैं।

हालांकि समान Algorithm को बार-बार अलग-अलग Types के Data पर Operate करने के लिए हम Overloading Concept को भी Use कर सकते हैं। लेकिन यदि हम बहुत ज्यादा Overloading करें, तो दो परेशानियां पैदा होती हैं।

  • Program की Speed यानी Performance पर Negative Effect पडता है क्योंकि C# Runtime को हर बार एक ही Method के Signature के आधार पर इस बात का पता लगाना पडता है कि उसे किस Method को Execute करना है। और
  • हमें समान प्रकार के Algorithm को अलग-अलग Data Types के लिए बार-बार Implement करने की वजह से Program की Size काफी ज्यादा बडी हो जाती है, जिसकी वजह से भी Program की Performance भी प्रभावित होती है और Program को Manage व Maintain करना भी काफी मुि”कल हो जाता है।

Generics हमें इन्हीं परेशानियों से छुटकारा दिलवाता है। यानी Generic हमें ऐसे Algorithm Implement Create करने की सुविधा प्रदान करता है कि हम एक Algorithm को एक ही तरह के Syntax द्वारा अलग-अलग तरह के Data के लिए समान प्रकार से Use कर सकते हैं।

Generics को अन्‍य शब्दों में Parameterized Types भी कहा जाता है। क्योंकि हमें हमारे Code को जिस प्रकार के Data पर Apply करना होता है, हम उस Data Type को भी Parameter की तरह Specify कर देते हैं। यानी Generics Concept का प्रयोग करके हम ऐसी Classes, Structures, Methods या Delegates Create कर सकते हैं, जो Specify किए जाने वाले Parameterized Type के आधार पर Operate होते हैं। जबकि Parameter के रूप में Pass किए जाने वाले Type को Generic के नाम से जाना जाता है।

उदाहरण के लिए यदि हम Method के साथ Generic Type को Parameter की तरह Pass करते हैं, तो इस तरह से Method को Generic Method कहते हैं। इसी तरह से यदि हम किसी Class के साथ Parameterized Type को Specify करते हैं, तो इस तरह ही Class को Generic Class कहते हैं।

चूंकि .NET Framework में object एक Top Level Class होती है, इसलिए हम ऐसे Generalized Code Create कर सकते हैं, जो object Type के Reference द्वारा Accessible हो सकते हैं। यानी object Type के Reference द्वारा हम किसी Generalized Code को किसी भी प्रकार के Data के साथ Operate करने के लिए Use कर सकते हैं, क्योंकि .NET Framework में सबकुछ Class व Object ही होता है। यहां तक कि Primary Data Types भी वास्तव में Class ही होते हैं।

Generics को C# में Add करने से पहले समस्या ये आती थी कि जब भी हम Actual Type के Data को object Type के साथ Access व Manipulate करते थे, तो हमें Type Casting करना Compulsory रूप से जरूरी होता था, क्योंकि C# एक Type Strict Programming Language है और समान Type के Data के साथ ही किसी भी तरह का Operation Perform कर सकता है। जबकि यदि हम उपयुक्त Type Casting का प्रयोग न करें, तो C# Compiler हमें Compile Time Error Return करता है।

इसलिए एक ऐसे तरीके की जरूरत महसूस की गई कि ऐसे General Code Create किए जा सकें, जो कि Program के Runtime में तय करें, कि उन्हें किस Type के Data के साथ Operation Perform करना है।

Generics Concept का प्रयोग करके Code Create करते समय हम किसी Type को Specify ही नहीं करते जिस पर Code को Operate होना है। बल्कि हम एक General Type Specify कर देते हैं और Program के Runtime में हमें जिस Type के Data पर Operate करने के लिए उस Code को Use करना होता है, उस Type को Parameter के रूप में Specify कर देते हैं।

परिणामस्वरूप जब हम Generics Code Use करते हैं, हमें Type Casting की चिन्ता करने की जरूरत नहीं होती और हम किसी भी Type के Data पर Generics Code को Operate करने के लिए object Type के Reference को Use कर सकते हैं।

अभी तक हमने जितने भी Programs Create किए हैं, उन सभी में हमने BCL द्वारा Provided Specific Types को Strictly Use किया है और यदि किसी एक Type के Data को किसी दूसरे Type द्वारा Refer किया है, तो उसे Strictly Type Cast करके Refer किया है। लेकिन इस Chapter में हम Generics Concept को Use करते हुए ऐसे General Code Create करना सीखेंगे, जो कि किसी भी Type के Data के लिए समान प्रकार से Use हो सकेंगे।

Generics in C# – The Generic Method

किसी भी Concept को समझने का सबसे आसान तरीका यही होता है कि हम एक Example द्वारा उस Concept को समझने की कोशिश करें और Generics के Concept को भी हम एक Example द्वारा ही समझने की कोशिश करेंगे। हम हमारे उदाहरण के रूप में निम्नानुसार Swapping करने के लिए Define किए गए Method को Use कर रहे हैं:

	// Swap two integers.
	static void Swap(ref int a, ref int b)
	{
		int temp;
		temp = a;
		a = b;
		b = temp;
	}

हालांकि ये Method दो Integer Values को तो Normal तरीके से Swap करेगा, लेकिन यदि हम इस Method को दो Floating Point Values अथवा दो Person Type के Objects की Swapping के लिए Use करना चाहें, तो नहीं कर सकते। बल्कि हमें विभिन्न Type के Data की Swapping के लिए एक अलग Overloaded Method Create करना होगा।

जब भी कभी ऐसी स्थिति होती है, जहां Parameter के रूप में आने वाले Data के Type में ही अन्तर होता है, लेकिन उनकी Internal Working में कोई अन्तर नहीं होताए तो इस तरह के Method को हम Generic Method की तरह Define कर सकते हैं। इसलिए यदि हम उपरोक्त Swapping Method को एक Generic Method के रूप में Define करना चाहें, तो हमारा Generic Method कुछ निम्नानुसार हो सकता है:

	// Swap two General Types.
	static void Swap<TYPE>(ref TYPE a, ref TYPE b)
	{
		TYPE temp;
		temp = a;
		a = b;
		b = temp;
	}

जैसाकि हम इस Modified Method को देख सकते हैं, ये एक Generic Method का Example है। अत: यदि हम इस Generic Method को Use करना चाहें, तो निम्नानुसार तरीके से एक Program बनाकर इसे विभिन्न प्रकार के Data की Swapping करने के लिए Use कर सकते हैं:

File Name: GenercMethod.cs
using System;

namespace CSharpGenerics
{
    class UsingGenericMethod
    {
        // Swap two General Types.
        static void Swap<TYPE>(ref TYPE a, ref TYPE b)
        {
            TYPE temp;
            temp = a;
            a = b;
            b = temp;
        }

        public static void Main()
        {
            // Swap 2 ints.
            int a = 10, b = 90;
            Console.WriteLine("Before swap integers: {0}, {1}", a, b);
            Swap<int>(ref a, ref b);
            Console.WriteLine("After swap integers: {0}, {1}\n", a, b);

            // Swap 2 strings.
            string s1 = "Hello", s2 = "There";
            Console.WriteLine("Before swap strings: {0} {1}!", s1, s2);
            Swap<string>(ref s1, ref s2);
            Console.WriteLine("After swap strings: {0} {1}!", s1, s2);
        }
    }
}

// Output:
   Before swap integers: 10, 90
   After swap integers: 90, 10

   Before swap strings: Hello There!
   After swap strings: There Hello!

इस Program से हम Generics के फा;दे को आसानी से समझ सकते हैं। हम देख सकते हैं कि इस Program में हमने Swapping का केवल एक Generic Method Create किया है और उस Generic Method को जिस तरह से दो Integers को Swap करने के लिए Use किया है, उसी Generic Method का प्रयोग करके हमने दो Strings को भी Swap कर लिया है। इतना ही नहीं, इसी Generic Method को Use करके हम किसी भी प्रकार के Data की Swapping कर सकते हैं।

जबकि यदि हम इस जरूरत को Overloaded Method द्वारा पूरा करने की कोशिश करें, तो हमें विभिन्न Primitive Data Type के लिए तो Overloaded Method Create करना ही होगा, साथ ही हर User Defined Type के लिए हमें अलग से Overloaded Method Create करना होगा, जो कि एक असम्भव काम है। क्योंकि अलग-अलग Applications की जरूरत अलग-अलग होती है और हर Application के लिए हमें अलग तरह के User Defined Types Create करने पडते हैं। इसलिए सभी User Defined Types के लिए Overloaded Method Create करना असम्भव है।

जबकि Generics Concept का प्रयोग करके हमने इस Program में जो Swapping Method Create किया है, उसे हम किसी भी Type की Swapping करने के लिए बिना किसी तरह का Modification किए हुए एक Use कर सकते हैं।

C# में हम विभिन्न प्रकार के Real World Objects को Define करने के लिए जो Type (Class, Structure, etc…) Create करते हैं, वे सभी मात्र Manipulate होने वाले Object का Representation या Template होते हैं। ठीक उसी तरह से Generics उन Types का Template होते हैं। यानी Generic Type स्वयं कोई Type नहीं होते बल्कि वे Built-In या User Defined Types के Templates होते हैं।

C# हमें Classes, Structures, Interfaces, Delegates व Methods यानी कुल 5 प्रकार के Generics Define करने की सुविधा Provide करता है, जिसे हम निम्न चित्रानुसार Represent कर सकते हैं:

Generics in C# - Hindi - Generic Method

Generics in C# – Hindi – Generic Method

जैसाकि हमने पिछले उदाहरण में देखा कि Generic Type Define करने के लिए हमें हमारे किसी भी Algorithm Implementation में बहुत ही मामूली सा परिवर्तन करना होता है।

यानी हमें हमारे Algorithm Implementation में किसी Specific Type को Specify करने के स्थान पर एक General Type को Specify करना होता है और Method को Use करते समय हमें Parameter के रूप में वह Type Specify करना होता है, जिस Type के Data पर हम उस Generic Type के Code को Apply करना चाहते हैं।

यदि हम उपरोक्त उदाहरण के आधार पर समझें, तो यदि हमें Integer Type के Data को Swap करना हो, तो Generic Type में हमें Parameter के रूप में निम्नानुसार int Keyword को Specify करना होता है:

Swap<int>(ref a, ref b);

जबकि यदि हमें String Type के Data को Swap करना हो, तो Generic Type में हमें Parameter के रूप में निम्नानुसार string Keyword को Specify करना होता है:

Swap<string>(ref a, ref b);

इसी तरह से यदि हमें Floating Point Type के Data को Swap करना हो, तो Generic Type में हमें Parameter के रूप में निम्नानुसार float Keyword Specify करना होता है:

Swap<float>(ref a, ref b);

यानी हम जिस तरह के Data पर Operation Perform करना चाहते हैं, हमें उसी Type को Generic Type की तरह Parameter के रूप में Specify करना होता है।

परिणामस्वरूप जब Program Run होता है, तो Generic Code में उन सभी Specified Generics को Specify किए गए Type से Replace कर देता है और हमारा Code Current Type के Data के लिए काम करने लगता है। यानी जब हम हमारे Program में निम्नानुसार Code Use करते हुए int Keyword Specify करते हैं:

Swap<int>(ref a, ref b);

तो हमारे Swap() नाम के निम्नानुसार Defined Generic Method:

        static void Swap<TYPE>(ref TYPE a, ref TYPE b)
        {
            TYPE temp;
            temp = a;
            a = b;
            b = temp;
        }

में TYPE शब्द के स्थान पर int Keyword Replace हो जाता है। परिणामस्वरूप हमारा यही Generic Method निम्नानुसार Integer Type के लिए Modify हो जाता है:

        static void Swap<int>(ref int a, ref int b)
        {
            int temp;
            temp = a;
            a = b;
            b = temp;
        }

जबकि float Keyword Specify करने पर हमारे इसी Generic Method में TYPE शब्द के स्थान पर float Keyword Replace हो जाता है। परिणामस्वरूप हमारा यही Generic Method निम्नानुसार Floating Point Type के लिए Modify हो जाता है:

        static void Swap<float>(ref float a, ref float b)
        {
            float temp;
            temp = a;
            a = b;
            b = temp;
        }

इस तरह से एक ही Generic Method अलग-अलग प्रकार के Data के लिए Program के Runtime में Modify हो जाता है।

Generics in C# – The Generic Classes

जैसाकि हम जानते हैं कि किसी भी नए User Defined Class Type को Define करने व Use करने में दो Steps Involved होते हैं। पहले Step के अन्तर्गत हम हमारे Application की जरूरत के अनुसार किसी Real World Object को Class के रूप में एक नए Data Type की तरह अपने Program में Represent करने के लिए Class Design करते हैं और फिर उस Class के आधार पर Object या Instance Create करते हैं।

लेकिन Generic Class स्वयं कोई Class नहीं होते, बल्कि किसी Class का Template होते हैं। इसलिए हम जब Generic Class Define करते हैं, तो वास्तव में हम किसी Actual Class का Template ही Create कर रहे होते हैं, जिसके आधार पर अलग-अलग तरह की और Classes Define की जा सकती हैं।

इसलिए जब हम Generic Classes का Object Create करना चाहते हैं, तो पहले हमें हमारी Generic Class के आधार पर Actual Class Type को ही Create करना होता है और फिर इस Actual Class Type का Instance या Object Create करना होता है। इस प्रक्रिया को हम निम्न चित्र द्वारा आसानी से Represent कर सकते हैं:

Generics in C# - Hindi - Generic Class

Generics in C# – Hindi – Generic Class

Defining Generic Class Type

Generic Class Type Define करते समय हमें सबसे पहले Class के विभिन्न Members के Types को एक Generic <TYPE> के साथ Define करना होता है। फिर हमें इस Generic <TYPE> को किसी Specific Type से Replace करना होता है, जिसे Constructed Type के नाम से जाना जाता है और अन्त इस Constructed Type का Object या Instant Create किया जाता है।

उदाहरण के लिए यदि हम SomeClass नाम की एक Generic Class Define करना चाहें, तो Type Parameters को Angle Brackets के बीच निम्नानुसार तरीके से Specify किया जाता है:

हम देख सकते हैं कि Generic Class Define करने के लिए हमें कोई Special Keyword Use करने की जरूरत नहीं होती। बल्कि Angle Brackets के बीच हम जो Generic Parameters Specify करते हैं, उस Specification से ही कोई Class एक Normal Class के स्थान पर एक Generic Class की तरह Define हो जाता है।

C# Event Handler
Generics in C# with Example

C# in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C#.NET in Hindi | Page:908 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE

Download All Hindi EBooks

सभी हिन्दी EBooks C, C++, Java, C#, ASP.NET, Oracle, Data Structure, VB6, PHP, HTML5, JavaScript, jQuery, WordPress, etc... के DOWNLOAD LINKS प्राप्‍त करें, अपने EMail पर।

Register करके Login करें। इस Popup से छुटकारा पाएें।