Я хотел бы использовать индексаторы больше, но я не уверен, когда использовать их. Все, что я нашел онлайн, является примерами то использование классы как MyClass
и IndexerClass
.
Что относительно в школьной системе, где существуют Студенты и Учителя, и у каждого Учителя есть список Студентов, что они отвечают за - какая-либо потребность в индексаторах в том сценарии? Для пользы простоты: каждый Студент может только принадлежать одному Учителю.
Обычно индексатор используется, если класс представляет список, коллекцию или массив объектов. В вашем случае вы можете предоставить индексатор для предоставления доступа на основе индексов ученикам учителя.
Индексатор - это средство для выбора элемента из совокупности, такой как массив или коллекция. Хотя я частично согласен с Яном Дэвисом, я думаю, что индексаторы представляют собой нечто большее, чем полировка публичного API.
Индексаторы являются основным средством доступа к массивам, и большинство основных классов, представляющих коллекции в .NET BCL, реализовали индексаторы, предположительно для обеспечения общего опыта при работе с типами, объединяющими другие типы.
Поскольку индексаторы являются стандартной частью интерфейса многих типов коллекций BCL, и поскольку эти типы активно используются, по мере того как разработчики осваивают .NET как платформу, разумно предположить, что создается ожидание, что доступ к коллекциям можно получить с помощью какого-либо типа индексатора.
Если интерфейс вашего типа соответствует ожиданиям, которые уже есть у разработчиков, то этот тип становится проще использовать, потому что разработчику не нужно думать. Это справедливо независимо от того, являются ли данные разработчики внутренними в вашей организации или находятся на свободе.
Конечно, бывают ситуации, когда наличие индексатора просто не имеет смысла, и если это так, то не стоит внедрять индексатор.
Доступ в случайном порядке
Вы будете использовать перечислитель, если ваши данные обычно доступны последовательно.
Индексатор, с другой стороны, полезен для прямого доступа к определенному элементу, без определенного порядка.
Конечно, это предполагает, что вы знаете индекс элемента, который вам нужен. Комбобоксы, например, всегда поддерживали два значения: строку, показываемую пользователю, и id, принадлежащий ей. Вы можете использовать id выбранного элемента в combobox для прямого доступа к индексу вашей коллекции, вместо того, чтобы искать его в коллекции.
Приятной особенностью индексаторов в C# является то, что вы можете перегружать их, чтобы получить доступ к элементам через различные ключи.
IMHO, индексаторы, вероятно, лучше всего, если вы пытаетесь украсить упакованный API - это не стоит усилий для вашего запуска обычного бизнес-объекта.
И если вы создаете какую-то специализированную коллекцию, я бы назвал это улучшением вашего упакованного API - даже если вы сохраните все это в одном модуле.
Индексатором в вашей ситуации может быть класс 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();
}
}
}
Простой ответ (как указано выше): когда класс представляет / содержит коллекцию элементов, индексатор вернет элементы коллекции.
public Student this[int index] { ..
В более сложном случае вы можете создать поведение по умолчанию с классом и сделать его немного похожим на делегата, особенно когда класс представляет отображение или процесс. Например, класс, который вычисляет скорость охлаждения пива в холодильнике:
Вместо ввода
temperature = coorsLight.CalculateFutureTemperature(time);
вы можете связать это с
temperature = coorsLight[time];
, если ожидаемое поведение (и намерение) класса состоит в том, чтобы вернуть значение.