Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Перегрузка индексаторов

31

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

Имейте в виду, что индексаторы могут быть перегружены в отдельном классе или структуре. То есть если имеет смысл позволить вызывающему коду обращаться к подэлементам с использованием числового индекса или строкового значения, в одном и том же типе можно определить несколько индексаторов. Например, если вы когда-либо программировали с применением ADO.NET (встроенный API-интерфейс .NET для доступа к базам данных), то вспомните, что тип DataSet поддерживает свойство по имени Tables, которое возвращает строго типизированную коллекцию DataTableCollection. В свою очередь, в DataTableCollection определены три индексатора для получения объектов DataTable — по порядковому номеру, по дружественным строковым именам и необязательному пространству имен.

Давайте рассмотрим пример использования перегрузки индексаторов:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class MyArr
    {
        int[] arr;
        public int Length;

        public MyArr(int Size)
        {
            arr = new int[Size];
            Length = Size;
        }

        public int this[int index]
        {
            get
            {
                return arr[index];
            }

            set
            {
                arr[index] = value;
            }
        }

        // Перегружаем индексатор
        public int this[double index]
        {
            get
            {
                return arr[(int)Math.Round(index)];
            }

            set
            {
                arr[(int)Math.Round(index)] = value;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyArr arr = new MyArr(5);
            arr[0] = 5;
            arr[1.235] = 12;
            arr[2] = 3;
            arr[3.045] = 18;
            arr[3.9] = 1;

            Console.WriteLine("Получившийся массив: ");
            for (int i = 0; i < arr.Length; i++)
                Console.Write("{0}\t",arr[i]);

                Console.ReadLine();
        }
    }
}
Применение перегрузки индексаторов в C#

Представленный выше пример программы наглядно демонстрирует правомочность перегрузки индексаторов, но на практике она применяется нечасто. Как правило, индексаторы перегружаются для того, чтобы использовать объект определенного класса в качестве индекса, вычисляемого каким-то особым образом.

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

Пройди тесты