Когда необходимо использовать индексаторы C#?

Я хотел бы использовать индексаторы больше, но я не уверен, когда использовать их. Все, что я нашел онлайн, является примерами то использование классы как MyClass и IndexerClass.

Что относительно в школьной системе, где существуют Студенты и Учителя, и у каждого Учителя есть список Студентов, что они отвечают за - какая-либо потребность в индексаторах в том сценарии? Для пользы простоты: каждый Студент может только принадлежать одному Учителю.

16
задан alex 30 March 2017 в 19:20
поделиться

6 ответов

Обычно индексатор используется, если класс представляет список, коллекцию или массив объектов. В вашем случае вы можете предоставить индексатор для предоставления доступа на основе индексов ученикам учителя.

3
ответ дан 30 November 2019 в 22:09
поделиться

Индексатор - это средство для выбора элемента из совокупности, такой как массив или коллекция. Хотя я частично согласен с Яном Дэвисом, я думаю, что индексаторы представляют собой нечто большее, чем полировка публичного API.

Индексаторы являются основным средством доступа к массивам, и большинство основных классов, представляющих коллекции в .NET BCL, реализовали индексаторы, предположительно для обеспечения общего опыта при работе с типами, объединяющими другие типы.

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

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

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

1
ответ дан 30 November 2019 в 22:09
поделиться

Доступ в случайном порядке

Вы будете использовать перечислитель, если ваши данные обычно доступны последовательно.

Индексатор, с другой стороны, полезен для прямого доступа к определенному элементу, без определенного порядка.

Конечно, это предполагает, что вы знаете индекс элемента, который вам нужен. Комбобоксы, например, всегда поддерживали два значения: строку, показываемую пользователю, и id, принадлежащий ей. Вы можете использовать id выбранного элемента в combobox для прямого доступа к индексу вашей коллекции, вместо того, чтобы искать его в коллекции.

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

3
ответ дан 30 November 2019 в 22:09
поделиться

IMHO, индексаторы, вероятно, лучше всего, если вы пытаетесь украсить упакованный API - это не стоит усилий для вашего запуска обычного бизнес-объекта.

И если вы создаете какую-то специализированную коллекцию, я бы назвал это улучшением вашего упакованного API - даже если вы сохраните все это в одном модуле.

0
ответ дан 30 November 2019 в 22:09
поделиться

Индексатором в вашей ситуации может быть класс TeachersClass, который инкапсулирует учеников (коллекцию) и текущего учителя. Хотя вы можете сделать то же самое, открыв список студентов, но он показывает вам пример.

Вот пример кода:

public class TeachersClass
    {
        private List<Student> _students;

        public TeachersClass(Teacher currentTeacher, List<Student> students)
        {
            CurrentTeacher = currentTeacher;
            _students = students;
        }

        public Teacher CurrentTeacher { get; set; }

        public Student this[int studentID]
        {
            get
            {
                return (from s in _students
                        where s.Id = studentID
                        select s).First();
            }
        }   
    }
0
ответ дан 30 November 2019 в 22:09
поделиться

Простой ответ (как указано выше): когда класс представляет / содержит коллекцию элементов, индексатор вернет элементы коллекции.

public Student this[int index] { ..

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

Вместо ввода

temperature = coorsLight.CalculateFutureTemperature(time);

вы можете связать это с

temperature = coorsLight[time];

, если ожидаемое поведение (и намерение) класса состоит в том, чтобы вернуть значение.

1
ответ дан 30 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: