Indexer نوع خاصی در سی شارپ است که بسیار شبیه property ها است. این نوع خاص به کلاس ها و یا ساختارها اجازه میدهد به کالکشن های داخلی خود به روش دسترسی به آرایه ها دسترسی پیدا کنند. در این فصل با Indexer ها در سی شارپ آشنا میشویم.
Indexer
Indexer
ها از نظر قاعده دستوری شبیه property ها هستند اما در قاعده دستوری آنها از کلمه کلیدی this هم استفاده میشود :
Public <return type> this[<parameter type> index]
{
Get{
// return the value from the specified index
}
Set{
// set values at the specified index
}
}
نمونه مثال زیر نشان می دهد که چطور از Indexer ها میتوان در یک کلاس استفاده کرد :
class StringDataStore
{
private string[] strArr = new string[10]; // internal data storage
public string this[int index]
{
get
{
if (index < 0 && index >= strArr.Length)
throw new IndexOutOfRangeException("Cannot store more than 10 objects");
return strArr[index];
}
set
{
if (index < 0 && index >= strArr.Length)
throw new IndexOutOfRangeException("Cannot store more than 10 objects");
strArr[index] = value;
}
}
}
class Program
{
static void Main(string[] args)
{
StringDataStore strStore = new StringDataStore();
strStore[0] = "One";
strStore[1] = "Two";
strStore[2] = "Three";
strStore[3] = "Four";
for (int i = 0; i < 10; i++)
Console.WriteLine(strStore[i]);
}
}
خروجی نمونه مثال فوق به شکل زیر است :
One Two Three Four
در نمونه مثال بالا کلاس StringDataStore
یک indexer را برای آرایه داخلی خود پیاده سازی کرده است. بنابراین اکنون شی StringDataStore میتواند همچون یک آرایه برای اضافه کردن و واکشی داده های رشته استفاده شود. در نمونه مثال بالا از آرایه ای رشته ای استفاده کرده ایم اما شما می توانید از هر نوع کالکشن دیگری که مورد نیازتان هست استفاده کنید.
نسخه های متفاوت از Indexer
میتوان با مشخص کردن نوع های مختلف برای Indexer نسخه های متفاوتی از آن را ایجاد کرد. نمونه مثال زیر نشان میدهد که چطور یک Indexer میتواند با دو نوع string
و int
کار کند :
class StringDataStore
{
private string[] strArr = new string[10]; // internal data storage
public StringDataStore()
{
}
public string this[int index]
{
get
{
if (index < 0 && index >= strArr.Length)
throw new IndexOutOfRangeException("Cannot store more than 10 objects");
return strArr[index];
}
set
{
if (index < 0 && index >= strArr.Length)
throw new IndexOutOfRangeException("Cannot store more than 10 objects");
strArr[index] = value;
}
}
public string this[string name]
{
get
{
foreach (string str in strArr){
if(str.ToLower() == name.ToLower())
return str;
}
return null;
}
}
}
class Program
{
static void Main(string[] args)
{
StringDataStore strStore = new StringDataStore();
strStore[0] = "One";
strStore[1] = "Two";
strStore[2] = "Three";
strStore[3] = "Four";
Console.WriteLine(strStore["one"]);
Console.WriteLine(strStore["two"]);
Console.WriteLine(strStore["Three"]);
Console.WriteLine(strStore["FOUR"]);
}
}
خروجی نمونه مثال فوق به شکل زیر است :
One Two Three Four
ایجاد کد Indexer به صورت خودکار در ویژوال استودیو
ویژوال استودیو یک راه میانبر را برای ایجاد خودکار Indexer فراهم میآورد که در این صورت نیاز نیست به صورت دستی همه آن را تایپ کنید. برای این کار کافیست کلمه Indexer را نوشته و سپس کلید Tab
را فشار دهید. در این صورت ویژوال استادیو یک قالب Indexer را برای شما ایجاد خواهد کرد :