C# Indexer
सी शार्प के अंतर्गत इंडेक्शर एक खास प्रकार की प्रॉपर्टी है जिसकी सहायता से क्लास के भीतर जितने भी फील्ड्स है उन सभी फील्ड्स को उनके इंडेक्स पोजीशन के आधार पर गेट या सेट किया जा सकता है।
आमतौर पर प्रत्येक फील्ड के संगत एक प्रॉपर्टी होती है जो प्रॉपर्टी उस फील्ड को गेट या सेट करने में मदद करती है लेकिन प्रॉपर्टी एक नाम होता है जिस नाम का उपयोग करके हम उस फील्ड को गेट या सेट करते हैं इसके विपरीत इंडेक्सर एक ऐसी युक्ति है जिसकी सहायता से क्लास को एक वर्चुअल array के रूप में परिवर्तित किया जाता है और उस क्लास को इंडेक्स वैल्यू देकर उस क्लास के किसी फील्ड को गेट या सेट कर सकते हैं। उदाहरण के लिए, यदि कोई क्लास Employee हो तो indexer की मदद से Employee(0), Employee(1), Employee(2) इत्यादि Employee क्लास के प्रथम तीन फील्ड्स को इंगित करेंगे।
इंडेक्शर का syntax
<modifier> <type> this( int index)
{
get{}
set{}
}
ऊपर के उदाहरण में index की जगह कोई अन्य नाम जैसे position, i इत्यादि भी लिख सकते हैं।
इंडेक्शर का modifier public, protected इत्यादि हो सकता है।
अगर क्लास के सारे फील्ड्स एक टाइप के हैं तो उस हालत में हम इंडेक्शर का टाइप फील्ड की टाइप का देते हैं। उदाहरण के लिए, मान लीजिए कि किसी क्लास के सारे फील्ड्स string टाइप के हैं तो ऐसी हालत में हम इंडेक्शर का टाइप स्ट्रिंग देंगे परंतु अगर क्लास के फील्ड्स अलग अलग टाइप के हैं तो ऐसी हालत में इंडेक्शर का टाइप object देते हैं।
get block के भीतर किसी फील्ड को गेट करने की लॉजिक लिखते हैं जबकि set block के भीतर किसी फील्ड को सेट करने की लॉजिक लिखते हैं।
अब हम इंडेक्शर के बारे में एक उदाहरण से समझते हैं
namespace IndexerExample
{
class Employee
{
int EmpId;
string EmpName;
string Department;
double Salary;
public Employee(int EmpId, string EmpName, string Department, double Salary)
{
this.EmpId = EmpId;
this.EmpName = EmpName;
this.Department = Department;
this.Salary = Salary;
}
public object this [int index]
{
get
{
if (index == 0)
return EmpId;
else if (index == 1)
return EmpName;
else if (index == 2)
return Department;
else if (index == 3)
return Salary;
else
return null;
}
set
{
//indexer returns object by default
//We typecast to appropriate type as per the type of field
if (index == 0)
EmpId = (int)value;
else if (index == 1)
EmpName = (string)value;
else if (index == 2)
Department = (string)value;
else if (index == 3)
Salary = (double)value;
}
}
}
}
using System;
namespace IndexerExample
{
class Program
{
static void Main(string[] args)
{
Employee employee = new Employee(1,"Ajeet","Sales",20000);
Console.WriteLine("GET the old values:");
Console.WriteLine("ID: "+ employee[0]);
Console.WriteLine("Name: " + employee[1]);
Console.WriteLine("Department: " + employee[2]);
Console.WriteLine("Salary: " + employee[3]);
Console.WriteLine("SET the new values:");
employee[0] = 2;
employee[1] = "Rajan";
employee[2] = "IT";
employee[3] = 23560.50;
Console.WriteLine("ID: " + employee[0]);
Console.WriteLine("Name: " + employee[1]);
Console.WriteLine("Department: " + employee[2]);
Console.WriteLine("Salary: " + employee[3]);
Console.ReadLine();
}
}
}
OUTPUT:
The important part of indexer definition is its return type because an indexer has no name; next important part is the logic written inside the get and set. Its syntax is as followsreturn_type this[type index] {get{} set{}}
Let's consider Quality class. Suppose that we create an object Quality e = new Quality ();
Now consider the following hypothetical situation.
e[0]= "Good"
e[1]= "Better"
e[2]= "Best"
For any other index values, set "NA".
For the above case, we will define the indexer in the Quality class as follows.
using System;
namespace CSharpConcepts.Indexers
{
public class Program
{
public static void Main()
{
Quality e = new Quality();
Console.WriteLine(e[0]);
Console.WriteLine(e[1]);
Console.WriteLine(e[2]);
Console.WriteLine(e[3]);
}
}
}
public class Quality
{
readonly string[] status = new string[] { "Good", "Better", "Best" };
public string this[int index]
{
get
{
if (index>=0 && index<3 )
{
return status[index];
}
else
{
return "NA";
}
}
}
}
© अजीत कुमार, सर्वाधिकार सुरक्षित।
इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।
No comments:
Post a Comment