Когда следует использовать индексаторы C #? - PullRequest
16 голосов
/ 23 июля 2010

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

.отвечает за - нужны ли индексаторы в этом сценарии?Для простоты: каждый ученик может принадлежать только одному Учителю.

Ответы [ 10 ]

7 голосов
/ 09 февраля 2017

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

Зачем использовать индексаторы:
- вместо новой структуры данных, сам класс является структурой данных.
- упрощенный синтаксис - синтаксический сахар

Когда использовать:
- если вашему классу нужен список (/ массив) его экземпляров (пример 1)
- если ваш класс представляет список (/ массив) значений, непосредственно связанных с вашим классом (пример 2)

Пример 1:

public class Person{
    public string Name{get; set;}

    private Person[] _backingStore;
    public Person this[int index]
    {
        get{
            return _backingStore[index];
        }
        set{
            _backingStore[index] = value;
        }
    }
}

Person p = new Person();
p[0] = new Person(){Name = "Hassan"};
p[1] = new Person(){Name = "John Skeet"};    

Пример 2:

class TempratureRecord{
    private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 61.3F, 56.5F, 56.9F, 58.8F, 61.3F};

    public int Length{
        get { return temps.Length; }
    }

    public float this[int index]
    {
        get{
            return temps[index];
        }
        set{
            temps[index] = value;
        }
    }
}
6 голосов
/ 24 декабря 2013

Вот видео, которое я создал http://www.youtube.com/watch?v=HdtEQqu0yOY, и ниже приведено подробное объяснение того же самого.

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

Например, допустим, у вас есть класс клиента с коллекцией адресов внутри.Теперь допустим, что мы хотели бы получить коллекцию адресов по «Pincode» и «PhoneNumber».Таким образом, логичным шагом будет то, что вы захотите создать две перегруженные функции, одну из которых выбирает с помощью «PhoneNumber», а другую - «PinCode».Как видно из приведенного ниже кода, у нас определены две функции.

Customer Customers = new Customer();
Customers.getAddress(1001);
Customers.getAddress("9090");

Если вы используете индексатор, вы можете упростить приведенный выше код с помощью чего-то, как показано в приведенном ниже коде.

Customer Customers = new Customer();
Address o = Customers[10001];
o = Customers["4320948"];

Приветствия.

3 голосов
/ 23 июля 2010

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

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

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

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

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

3 голосов
/ 23 июля 2010

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

1 голос
/ 23 июля 2010

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

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

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

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

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

1 голос
/ 23 июля 2010

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

public Student this[int index] { ..

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

Вместо ввода

temperature = coorsLight.CalculateFutureTemperature(time);

вы можете согласиться с этим

temperature = coorsLight[time];

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

0 голосов
/ 14 июля 2016

Я помню, было время, когда у меня было длинное внутри класса, и некоторые цифры этого конкретного длинного означали что-то (например, если третья цифра была 3, это означало, что диаграмма имела определенный тип кодировки, ужасносистема, которую я знаю, но я ее не изобрел)

Итак, я сделал что-то подобное, чтобы вернуть x-ую цифру числа:

protected int this[int index]
{
    get
    {
        int tempN = Number;
        if (index > 0)
        {
            tempN /= index * 10;
        }
        return tempN % 10;
    }
}

Он был защищен, потому что его использовал другой методТак что это был своего рода помощник.Конечно, простой GetDigit (int a) был бы тем же (и более понятным), но в то время я думал, что это был один из тех немногих раз, когда я думал, что использование индексатора будет иметь смысл.Не использовал их с = (.

0 голосов
/ 27 октября 2014

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

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

    // C#: INDEXER 
using System; 
using System.Collections; 

class MyClass 
{ 
    private string []data = new string[5]; 
    public string this [int index] 
    { 
       get 
       { 
           return data[index]; 
       } 
       set 
       { 
           data[index] = value; 
       } 
    } 
}

class MyClient 
{ 
   public static void Main() 
   { 
      MyClass mc = new MyClass(); 
      mc[0] = "Rajesh"; 
      mc[1] = "A3-126"; 
      mc[2] = "Snehadara"; 
      mc[3] = "Irla"; 
      mc[4] = "Mumbai"; 
      Console.WriteLine("{0},{1},{2},{3},{4}",mc[0],mc[1],mc[2],mc[3],mc[4]); 
   } 
} 

Код проекта

0 голосов
/ 23 июля 2010

В вашей ситуации индексатором будет класс 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 голосов
/ 23 июля 2010

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

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

...