Indexer 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

Indexer in C#: Indexer C# द्वारा Provided एक ऐसी व्‍यवस्था है, जिसका प्रयोग करके हम जिस तरह से Index Number के माध्‍यम से किसी Array के विभिन्न Elements को अपनी जरूरत के अनुसार Access करते हैं, उसी तरह से हम किसी Class के Members को भी Access करने की क्षमता प्राप्त कर लेते हैं।

उदाहरण के लिए मानलो कि निम्नानुसार एक Employee Class है, जिसमें LastName, FirstNameCityOfBirth नाम के तीन Fields हैं, जिन्हें Main() Method द्वारा Set करके Display किया जा रहा है:

Indexer in C# - Hindi

Indexer in C# – Hindi

लेकिन कई बार ऐसी स्थिति हो जाती है कि किसी Class के सभी Members को उपरोक्तानुसार Access करने के स्थान पर उन्हें Array की तरह Index Numbers के आधार पर Access करना ज्यादा आसान होता है। जैसे:

Indexer in C# - Hindi

Indexer in C# – Hindi

Properties की तरह ही Indexer भी वास्तव में getset Accessors का एक Pair होते हैं। किसी Class में Define किए गए Indexer को हम निम्न चित्रानुसार String Type की Value को Get Set करने के लिए Use कर सकते हैं:

Indexer in C# - Hindi

Indexer in C# – Hindi

Similarities of Indexer and Properties

C# के Indexers Properties कई तरीकों से एक समान होते हैं। Property की तरह ही Indexers को भी Actual Memory Allocate नही किया जाता है। साथ ही Properties व Indexers दोनों का उपयोग मूल रूप से किसी अन्‍य Data Member को Access करने की सुविधा Provide करना होता है, जिसके साथ ये Associated होते हैं और जिनके लिए ये GetSet Access Provide करते हैं।

लेकिन Property सामान्‍यत: केवल एक Single Data Member को ही Represent करता है जबकि Indexers Multiple Data Members को Represent करते हैं। यानी Indexers को हम ऐसी Property के रूप में मान सकते हैं, जो कि एक ही समय में Multiple Data Members को Get Set करने की सुविधा Provide करते हैं।

जब हम Indexers का प्रयोग करते हैं तो हमें जिस Data Member को Access करना होता है, उसे हम उसके Index Number के माध्‍यम से Get या Set करते हैं। साथ ही Index के रूप में केवल Numeric Numbers का ही प्रयोग किया जाए, ऐसा जरूरी नहीं होता। हम String या Alphanumerical Indexes को भी Specify कर सकते हैं।

Properties की तरह ही Indexer में भी getset Accessors में से एक या दो को Specify किया जा सकता है। चूंकि Indexers हमेंशा Instance Members होते हैं क्योंकि ये Class के विभिन्न Members को ही Indexes के माध्‍यम से Get व Set करने की सुविधा Provide करते हैं, इसलिए Indexer को कभी भी Static Declare नहीं किया जा सकता।

Properties की तरह ही getset Accessors को Implement करने वाले Codes का किसी Field या Property से Associated होना जरूरी नहीं होता। बल्कि get set Accessors को किसी भी प्रकार का काम करने के लिए Code किया जा सकता है, जबकि get Accessor द्वारा Specified Type के किसी न किसी Value को Return करना जरूरी होता है।

Defining Indexer in C#

Indexer का कोई नाम नहीं होताए बल्कि Indexer के नाम के स्थान पर हमें हमेंशा this Keyword का प्रयोग करना होता है क्योंकि this Keyword हमेंशा Current Object को ही Represent करता है। साथ ही Indexer की Parameter List को Square Brackets के बीच Specify करना होता है और Parameter List में कम से कम एक Parameter Specify करना जरूरी होता है। इस तरह से यदि हम Indexer के Syntax को देखें, तो ये कुछ निम्नानुसार हो सकता है:

	ReturnType this [ Type param1, … ]
	{
		get
		{
			. . .
		}

		set
		{
			. . .
		}
	}

किसी Indexer को Declare करना किसी Property को Declare करने के समान ही होता है, जिसे हम निम्न चित्र द्वारा आसानी से समझ सकते हैं:

Indexer in C# - Hindi

Indexer in C# – Hindi

Indexer set Accessor

जब Indexer किसी Assignment Operation का Target होता है यानी जब Indexer का प्रयोग करके Value को Assign करना होता है, तब हमें set Accessor Define करना पडता है। जब set Accessor Invoke होता है, तब set Accessor value नाम का एक Implicit Parameter Receive करता है, जिसमें Store किया जाने वाला Data होता है। साथ ही एक Index Parameter भी Receive करता है, जो कि उस Location को Represent करता है, जहां पर पहले Parameter के रूप में आने वाले value को Store करना होता है। इसे हम निम्नानुसार बेहतर तरीके से समझ सकते हैं:

Indexer in C# - Hindi

Indexer in C# – Hindi

जब हम set Accessor Define करते हैं, तब हमें Index Parameter को Examine करना जरूरी होता है कि जो इस बात को निश्चित करता है कि Assign किया जाने वाला Data Memory में कहां Store होगा। एक बार Location निश्चित हो जाने के बाद, Data को उस Location पर Store कर दिया जाता है। set Accessor के Syntax व Meaning को हम निम्न चित्र द्वारा समझ सकते हैं:

Indexer in C# - Hindi

Indexer in C# – Hindi

इस चित्र के Left Part में हम set Accessor Declaration के Actual Syntax को देख सकते हैं। जबकि चित्र का Right Part set Accessor के Semantics को Represent कर रहा है, जहां हम ये मान रहे हैं कि हमने Normal Method के Syntax को Use करते हुए इसे लिखा है।

Indexer get Accessor

जब Indexer का प्रयोग Value Retrieve करने के लिए किया जाता है, तब get Accessor Call होता है, जिसमें Parameter के रूप में एक या एक से अधिक Indexes होते हैं, जहां Index Parameter इस बात को Represent करता है कि किस Value को Retrieve करना है। इसे हम निम्नानुसार समझ सकते हैं:

Indexer in C# - Hindi

Indexer in C# – Hindi

इस Code में get Accessor की Body में इस बात को Examine करना जरूरी होता है कि Index Parameter किस Field को Represent कर रहा है। Index Parameter जिस Field को Represent कर रहा होता है, उसी Field के मान को get Accessor द्वारा Return करना होता है।

Indexer in C# - Hindi

Indexer in C# – Hindi

इस चित्र द्वारा हम get Accessor के Syntax व Semantics को बेहतर तरीके से समझ सकते हैं। इस चित्र के Left Part में get Accessor के Declaration Syntax को Specify किया गया है जबकि Right Part में get Accessor के Semantics को Specify किया गया है, जहां हम ये मान रहे हैं कि हमने Normal Method के Syntax को Use करते हुए इसे लिखा है।

Properties की तरह ही get set Indexers को Manually Call नहीं किया जा सकताए बल्कि जब Value Get करने के लिए Syntax लिखा जाता है, तब Automatically get Accessor Execute हो जाता है। इसी तरह से Assignment Operator का प्रयोग करते हुए Value Assign करते समय Automatically set Accessor Execute हो जाता है।

इस प्रकार से यदि हम हमारे पिछले उदाहरण Program को Modify करते हुए Employee Class के Data Members को Index द्वारा Access करने के लिए Indexer Specify करना चाहें, तो हमें निम्न स्थितियों को ध्‍यान में रखते हुए Indexer Define करना होगा:

  • चूंकि Employee Class के सभी Data Members String Type के हैं, इसलिए Indexer का प्रयोग करते समय Data को Read Write करने के लिए Indexer का String Type का होना जरूरी है। साथ ही Indexer को Public Access में Available रखने के लिए Indexer के साथ public Keyword का भी प्रयोग करना जरूरी है, ताकि External Class भी Employee Class के Indexers को Use कर सके।
  • चूंकि हम Index के रूप में Square Bracket के बीच Zero Based Numerical Values को Use करना चाहते हैं, इसलिए हमारा Index Integer Type का होना जरूरी है।
  • set Accessor की Body में लिखा गया Code इस बात को तय करता है कि Index Number किस Field को Refer कर रहा है और उस Field को value नाम के Implicit Variable का मान Assign करना होता है। जबकि get Accessor की Body में लिखा गया Code, Index Number के आधार पर इस बात को तय करता है कि किस Field के मान को Return करना है।

इन तीनों बातों को ध्‍यान में रखते हुए हम हमारे पिछले Program को निम्नानुसार तरीके से Modify कर सकते हैं:

// File Name: IndexerImplemented.cs
using System;

namespace CSharpClass
{
    class Employee
    {
        public string LastName; 	// Call this field 0.
        public string FirstName; 	// Call this field 1.
        public string CityOfBirth; 	// Call this field 2.

        public string this[int index] 	// Indexer declaration
        {
            set 	// Set Accessor declaration
            {
                switch (index)
                {
                    case 0:
                        LastName = value;
                    break;

                    case 1:
                        FirstName = value;
                    break;

                    case 2:
                        CityOfBirth = value;
                    break;

                    default:
                        throw new ArgumentOutOfRangeException("index");
                }
            }

            get 	// Get Accessor declaration
            {
                switch (index)
                {
                    case 0:
                        return LastName;

                    case 1:
                        return FirstName;

                    case 2:
                        return CityOfBirth;

                    default:
                        throw new ArgumentOutOfRangeException("index");
                }
            }
        }
    }

    class UsingEmployee
    {
        static void Main(String[] arg)
        {
            Employee emp1 = new Employee();
            emp1[0] = "Doe";
            emp1[1] = "Jane";
            emp1[2] = "Dallas";

            Console.WriteLine("Last Name: " + emp1[0]);
            Console.WriteLine("First Name: " + emp1[1]);
            Console.WriteLine("City of Birth: " + emp1[2]);
        }
    }
}

// Output:
   Last Name: Doe
   First Name: Jane
   City of Birth: Dallas

जैसाकि इस Program के Flow द्वारा हम समझ सकते हैं कि जब Main() Method में निम्न Statement Execute होता है:

emp1[0] = “Doe”;

तो C# Compiler Automatically Indexer के set Accessor को Execute करता है। चूंकि हमने Index Number का मान 0 Specify किया है, इसलिए set Accessor के switch Statement में case 0 Match करता है और LastName Field में set Accessor के माध्‍यम से “Doe” नाम Assign हो जाता है। जबकि निम्न Statement Execute होने पर:

Console.WriteLine(“Last Name: ” + emp1[0]);

C# Compiler Automatically Indexer के get Accessor को Execute करता है। चूंकि इस Statement में भी हमने Index Number का मान 0 Specify किया है, इसलिए get Accessor के switch Statement में case 0 Match करता है और get Accessor के माध्‍यम से LastName Field का मान “Doe” Return हो जाता है।

इसी तरह से हम किसी भी Class के Members को Indexes के माध्‍यम से Access व Manipulate करने के लिए getset Accessors को Define कर सकते हैं। जबकि Indexer के रूप में जरूरी नहीं है कि हम हमेंशा Numerical Index Number को ही Use करें। यदि हम चाहें तो Indexer के रूप में किसी String Value को भी Key की तरह Use कर सकते हैं, जैसाकि JavaScript व PHP जैसी Scripting Languages के Array में किया जाता है।

Indexer Overloading

हम किसी Class में एक से ज्यादा Indexers Define कर सकते हैं, क्योंकि Indexer भी Internally Method ही होते हैं और जिस तरह से Methods की Overloading होती है, उसी तरह से हम Indexers की भी Overloading कर सकते हैं।

जब हम एक ही Class में बहुत सारे Indexers Define करना चाहते हैं, तो सभी Indexers को हमेंशा this Keyword द्वारा ही Refer किया जाता है। इसलिए एक से ज्यादा Indexer Define करने पर Automatically उनकी Overloading हो जाती है।

Indexers की Overloading करते समय भी Method Overloading के Rules ही Apply होते हैं। यानी जब एक से ज्यादा Indexers के Parameter के Type, Parameter की संख्‍या व Parameters की Position में अन्तर होता है, तो इस प्रकार के सभी Indexers Overloaded Indexers कहलाते हैं। जैसे:

		class MyClass
		{
			public string this [ int index ]
			{
				get { ... }
				set { ... }
			}

			public string this [ int index1, int index2 ]
			{
				get { ... }
				set { ... }
			}

			public int this [ float index1 ]
			{
				get { ... }
				set { ... }
			}
			...
		}

Accessors and Access Modifiers

अभी तक हमने Property Indexers के get Accessorset Accessor के बारे में जाना हैं। इन दोनों प्रकार के Accessors पर वही Access Modifiers Apply होते हैं, जो Class के अन्‍य Methods पर होते हैं, क्योंकि Accessors भी वास्तव में Special Type के Methods ही होते हैं।

इसलिए जिन Accessors को public Keyword के साथ Define किया जाता है, उन्हें External Class द्वारा भी Use करना सम्भव होता है, जबकि जिन Accessors को private Keyword के साथ अथवा बिना कोई Keyword Specify किए हुए Define किया जाता है, उन्हें External Class द्वारा Use करना सम्भव नहीं होता।

हम दोनों Accessors के Access Levels को भी अलग-अलग Specify कर सकते हैं। उदाहरण के लिए यदि हम set Accessor को Private Access में रखना चाहते हैं, तो इस जरूरत को हम निम्नानुसार पूरा कर सकते हैं:

File Name: AccessorsAccessLevel.cs
using System;

namespace CSharpClass
{
    class Person
    {
        public string Name { get; private set; }

        public Person(string name)
        {
            Name = name;
        }
    }

    class UsingPerson
    {
        public static void Main()
        {
            Person doctor = new Person("Dr. Sharma");
            Console.WriteLine("Name: {0}", doctor.Name);
        }
    }
}

Output:
	Name: Dr. Sharma

चूंकि इस Program के Code में हमने set Accessor को Private Access में Specify कर दिया है, इसलिए कोई भी External Class, Person Class के Object के Data को Read तो कर सकता है, लेकिन यदि किसी External Class द्वारा Person Class के Object के Data को Set करना चाहे] तो नहीं कर सकते।

Accessors के Access Modifiers के साथ कई Restrictions हैं, जिनमें से कुछ निम्नानुसार हैं:

  • हम केवल उसी स्थिति में Accessors के साथ Access Modifiers को Specify कर सकते हैं, जबकि Property या Indexer के getset दोनों Accessors को Define किया गया हो।
  • भले ही दोनों Accessors को Specify किया गया हो, लेकिन हम दोनों में से केवल एक ही Accessor के साथ Access Modifier को Use कर सकते हैं।
  • Accessors के Access Levels, Class के Members के Access Levels से ज्यादा Restrictive होने जरूरी होते हैं।

निम्न चित्र द्वारा हम Access Level Hierarchy को ज्यादा बेहतर तरीके से समझ सकते हैं, जहां Accessors का Access Level हमेंशा Class के Members के Access Level से कम होता है।

Indexer in C# - Hindi

Indexer in C# – Hindi

उदाहरण के लिए यदि किसी Property का Access Level Public हो, तो उपरोक्त चित्र में दर्शा, चार Access Levels में से किसी भी Access Level को उस Property के Accessors के साथ Specify किया जा सकता है। लेकिन यदि Property का Access Level Protected हो, तो उस Property के Accessors को हम केवल Private Access Level ही Specify कर सकते हैं।

this Keyword in C#
C# Partial Class

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 से छुटकारा पाएें।