Автор: Пользователь скрыл имя, 08 Декабря 2010 в 23:21, доклад
Индексаторы позволяют индексировать экземпляры класса или структуры так же, как массивы.Индексаторы напоминают свойства, но их методы доступа принимают параметры.
Индексаторы являются синтаксическим удобством, позволяющим создавать класс, структуру или интерфейс, доступ к которому клиентские приложения получают, как к массиву. Чаще всего индексаторы реализуются в типах, главная цель которых — инкапсуляция внутренней коллекции или массива.
Индексаторы
Индексаторы позволяют индексировать экземпляры класса или структуры так же, как массивы.Индексаторы напоминают свойства, но их методы доступа принимают параметры.
Индексаторы являются синтаксическим удобством, позволяющим создавать класс, структуру или интерфейс, доступ к которому клиентские приложения получают, как к массиву. Чаще всего индексаторы реализуются в типах, главная цель которых — инкапсуляция внутренней коллекции или массива.
Другими словами, благодаря индексатору, к классу можно обращаться как к массиву, но иметь возможность обрабатывать чтение и запись.
Общие сведения об индексаторах
Объявление индексаторов
Чтобы объявить индексатор для класса или структуры, используется ключевое слово this:
public int this[int index]
{
// get and set accessors
}
Пример 1
class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World";
System.Console.WriteLine(
}
}
C# не ограничивает
тип индексатора типом "
Пример 2
class DayCollection
{
string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };
private int GetDay(string testDay)
{
for (int j = 0; j < days.Length; j++)
{
if (days[j] == testDay)
{
return j;
}
}
throw new
System.
}
public int this[string day]
{
get
{
return (GetDay(day));
}
}
}
class Program
{
static void Main(string[] args)
{
DayCollection week = new DayCollection();
System.Console.WriteLine(week[
// Ошибка что день недели не найден
System.Console.WriteLine(week[
}
}
Пример использования индексатора со строковым параметром.
В этом примере объявляется класс, в котором хранятся дни недели. Объявляется метод доступа get, который принимает строку (название дня недели) и возвращает соответствующее целое число. Например, воскресенье возвращает 0, понедельник возвращает 1 и т. д.
Индексаторы можно объявлять на interface. Между методами доступа индексаторов интерфейса и методами доступа индексаторов класса существуют следующие отличия:
Поэтому метод доступа предназначен для того, чтобы указывать, доступен ли индексатор для чтения и записи, только для чтения или только для записи.
Пример 3
public interface ISomeInterface
{
int this[int index]
{
get;
set;
}
}
class IndexerClass : ISomeInterface
{
private int[] arr = new int[100];
public int this[int index]
{
get
{
return arr[index];
}
set
{
arr[index] = value;
}
}
}
class MainClass
{
static void Main()
{
IndexerClass test = new IndexerClass();
test[2] = 4;
test[5] = 32;
for (int i = 0; i <= 10; i++)
{
System.Console.WriteLine("
}
}
}
Пример показывает использование индексаторов при использовании интерфейсов.
Оператор foreach повторяет
группу вложенных операторов для каждого
элемента массива или коллекции объектов,
реализующих интерфейс System.Collections.
Оператор foreach используется для итерации коллекции с целью получения необходимой информации, однако его не следует использовать для добавления или удаления элементов исходной коллекции во избежание непредвиденных побочных эффектов. Если нужно добавить или удалить элементы исходной коллекции, следует использовать цикл for.
Внедренные операторы продолжают выполняться для каждого элемента массива или коллекции. После завершения итерации всех элементов коллекции управление переходит к следующему оператору после блока foreach.
В любой точке блока foreach можно разорвать цикл с помощью ключевого слова break или перейти к следующей итерации в цикле с помощью ключевого слова continue.
Цикл foreach также может
быть разорван при помощи операторов goto, return или th
Дополнительные сведения о ключевом слове foreach и примеры кода приведены в следующих разделах:
Пример 4
int[,]
numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } };
foreach (int i in numbers2D)
{
System.Console.Write("{0} ", i);
}
Пример 5