Индексаторы

Автор: Пользователь скрыл имя, 08 Декабря 2010 в 23:21, доклад

Описание работы

Индексаторы позволяют индексировать экземпляры класса или структуры так же, как массивы.Индексаторы напоминают свойства, но их методы доступа принимают параметры.
Индексаторы являются синтаксическим удобством, позволяющим создавать класс, структуру или интерфейс, доступ к которому клиентские приложения получают, как к массиву. Чаще всего индексаторы реализуются в типах, главная цель которых — инкапсуляция внутренней коллекции или массива.

Работа содержит 1 файл

Индексаторы.docx

— 25.32 Кб (Скачать)

Индексаторы

Индексаторы позволяют  индексировать экземпляры класса или  структуры так же, как массивы.Индексаторы напоминают свойства, но их методы доступа принимают параметры.

Индексаторы являются синтаксическим удобством, позволяющим  создавать  класс,  структуру  или  интерфейс, доступ к которому клиентские приложения получают, как к массиву. Чаще всего индексаторы реализуются в типах, главная цель которых — инкапсуляция внутренней коллекции или массива.

Другими словами, благодаря индексатору, к классу можно обращаться как к массиву, но иметь возможность обрабатывать чтение и запись.

Общие сведения об индексаторах

  • Индексаторы позволяют индексировать объекты аналогично массивам.
  • Метод доступа get возвращает значение. Метод доступа set присваивает значение.
  • Ключевое слово this используется для определения индексаторов.
  • Ключевое слово value используется для определения значения, присваиваемого методом set индексатора.
  • Индексаторы не обязательно должны использовать в качестве индекса целочисленное значение; конкретный механизм поиска определяет разработчик.
  • Индексаторы могут иметь более одного формального параметра, например при доступе к двухмерному массиву.

Объявление  индексаторов

Чтобы объявить индексатор для класса или структуры, используется ключевое слово 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(stringCollection[0]);

    }

} 

C# не ограничивает  тип индексатора типом "integer". Например, может оказаться полезным использовании в индексаторе строки. Такой индексатор можно реализовать, выполнив поиск строки в коллекции и возвратив соответствующее значением. Методы доступа можно перегружать, версии типа "string" и "integer" могут сосуществовать.

 

Пример 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.ArgumentOutOfRangeException(testDay, "Ошибка: день недели не найден.");

    } 

    public int this[string day]

    {

        get

        {

            return (GetDay(day));

        }

    }

} 

class Program

{

    static void Main(string[] args)

    {

        DayCollection week = new DayCollection();

        System.Console.WriteLine(week["Fri"]); 

        // Ошибка что день недели не найден

        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("Element #{0} = {1}", i, test[i]);

        }

    }

} 

Пример показывает использование индексаторов при  использовании интерфейсов.

 

foreach, in

Оператор foreach повторяет группу вложенных операторов для каждого элемента массива или коллекции объектов, реализующих интерфейс System.Collections.IEnumerable  или System.Collections.Generic.IEnumerable<T>.

Оператор foreach используется для итерации коллекции с целью получения необходимой информации, однако его не следует использовать для добавления или удаления элементов исходной коллекции во избежание непредвиденных побочных эффектов. Если нужно добавить или удалить элементы исходной коллекции, следует использовать цикл for.

Внедренные операторы  продолжают выполняться для каждого  элемента массива или коллекции. После завершения итерации всех элементов коллекции управление переходит к следующему оператору после блока foreach.

В любой точке  блока foreach можно разорвать цикл с помощью ключевого слова break или перейти к следующей итерации в цикле с помощью ключевого слова continue.

Цикл foreach также может быть разорван при помощи операторов gotoreturn или throw.

Дополнительные  сведения о ключевом слове 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

Информация о работе Индексаторы