- Автор темы
- #1
Индексаторы
Индексаторы напоминают перегруженный оператор индексации в C++, они позволяют обращаться к экземпляру класса или структуры, как к массиву. Индексаторы похожи на свойства, но их функции доступа могут принимать параметры.
*****
Следующий пример приведен лишь в "воспитательных целях" для ознакомления с некоторыми возможностями индексаторов.
*****
Интерфейсы и индексаторы
При объявлении индексатора в интерфейсе нужно придерживаться следующих правил: индексатор описывается без модификаторов, индексатор должен иметь функции доступа без тела.
Отличия между свойствами и индексаторами
Представим отличия в виде таблицы:
*****
Индексаторы не являются переменными. Нельзя передать индексатор в функцию как ref или out параметр.
*****
Более подробную информацию можно получить, изучив практические
примеры, или заглянув в MSDN.
Индексаторы напоминают перегруженный оператор индексации в C++, они позволяют обращаться к экземпляру класса или структуры, как к массиву. Индексаторы похожи на свойства, но их функции доступа могут принимать параметры.
*****
Следующий пример приведен лишь в "воспитательных целях" для ознакомления с некоторыми возможностями индексаторов.
*****
Код:
using System;
using System.Collections;
class SomeClass : IEnumerable // Для использования foreach
{
// Поле
string [] words;
// Числовой индексатор
public string this [int index]
{
// Функция чтения
get
{
if(index < 0 || index >= words.Length)
throw new IndexOutOfRangeException();
return words[index];
}
// Функция записи
set
{
if(index < 0 || index >= words.Length)
throw new IndexOutOfRangeException();
words[index] = value;
}
}
// Строковый индексатор
public int this [string name]
{
// Функция чтения
get
{
// Поиск индекса, соответствующего искомой строке
return Array.IndexOf(words, name);
}
}
public SomeClass(int n)
{
if(n >= 0)
words = new string[n];
}
// Реализация интерфейса IEnumerable
public IEnumerator GetEnumerator()
{
// Массивы реализуют интерфейс IEnumerable самостоятельно
return words.GetEnumerator();
}
}
class Test
{
static void Main()
{
SomeClass sc = new SomeClass(3);
// Используем числовой индексатор
sc[0] = "book";
sc[1] = "bird";
sc[2] = "beer";
// Перебор значений массива
foreach(string s in sc)
{
Console.WriteLine(s);
}
// Используем строковый индексатор
Console.WriteLine(sc["beer"]);
Console.WriteLine(sc["boat"]);
}
}
Интерфейсы и индексаторы
При объявлении индексатора в интерфейсе нужно придерживаться следующих правил: индексатор описывается без модификаторов, индексатор должен иметь функции доступа без тела.
Код:
interface IMyInterface
{
...
// Объявление индексатора
string this[int index]
{
get;
set;
}
}
Отличия между свойствами и индексаторами
Представим отличия в виде таблицы:
*****
Индексаторы не являются переменными. Нельзя передать индексатор в функцию как ref или out параметр.
*****
Более подробную информацию можно получить, изучив практические
примеры, или заглянув в MSDN.