зачем нужны индексаторы c

BestProg

Индексаторы. Одномерные и многомерные индексаторы. Индексаторы без базового массива. Перегрузка индексаторов

Содержание

Поиск на других ресурсах:

1. Что называется индексатором? Каким образом индексаторы применяются в программах? Общая форма объявления индексатора

Чтобы использовать индексаторы в программах нужно объявить класс, содержащий индексатор. Класс может иметь внутренний массив, к элементам которого осуществляется доступ с помощью индексатора. После объявления класса с индексатором можно использовать объект этого класса как массив (с помощью прямоугольных скобок [ ] ). Чтобы использовать индексатор, он должен быть объявлен как public.

Так как и массивы, индексаторы могут быть одномерные и многомерные.

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

2. Пример объявления одномерного индексатора, который возвращает значение типа char

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

3. Пример объявления одномерного индексатора, возвращающего значение типа int

Использование класса IntArray в другом программном коде

4. Пример объявления одномерного индексатора в котором реализован индекс типа char

Использование класса в другом программном коде

5. Пример объявления двумерного индексатора

Использование класса TwoDimIndexes в некотором программном коде

6. Пример объявления трехмерного индексатора

Объявляется класс, который содержит трехмерный индексатор

Использование класса в другом программном коде

7. Какие особенности использования индексаторов без базового массива

В классе не обязательно объявлять внутреннюю переменную-массив для того, чтобы использовать индексатор. Конечно, данные можно сохранять и во внутренней переменной (массиве). Однако, бывают случаи, когда значение элементов массива формируются программно, то есть поддаются некоторой закономерности или формуле. В этих случаях не обязательно объявлять внутренний массив, для сохранения которого нужна дополнительная память.

8. Пример объявления класса, который содержит индексатор, но не содержит базового массива. Вычисление значения n-го числа Фибоначчи

Реализация класса имеет следующий вид

Использование класса CFibonacci в другом программном коде

9. Что называется перегрузкой индексаторов?

В общем виде реализация такого класса выглядит следующим чином:

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

В классе CDoubleArray демонстрируется использование перегруженного индексатора

Использование класса CDoubleArray в другом программном коде

Источник

Индексаторы (Руководство по программированию в C#)

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

В следующем примере определяется универсальный класс с простыми акцессорами get и set для назначения и получения значений. Класс Program создает экземпляр этого класса для хранения строк.

Дополнительные примеры см. в разделе Связанные разделы.

Определения текста выражений

Довольно часто акцессор get или set индексатора состоит из одной инструкции, которая просто возвращает или задает значение. Члены, воплощающие выражение, предоставляют упрощенный синтаксис для поддержки такого варианта использования. Начиная с версии C# 6, доступные только для чтения индексаторы можно реализовать в виде члена, воплощающего выражение, как показано в следующем примере.

Обратите внимание, что => представляет тело выражения, а ключевое слово get не используется.

Начиная с версии C# 7.0, методы доступа get и set можно реализовывать в виде членов с телом в виде выражения. В этом случае необходимо указывать оба ключевых слова ( get и set ). Пример:

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

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

Метод доступа get возвращает значение. Метод доступа set назначает значение.

Ключевое слово this используется для определения индексаторов.

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

Индексаторы могут быть перегружены.

Индексаторы могут иметь более одного формального параметра, например при доступе к двумерному массиву.

Связанные разделы

Спецификация языка C#

Дополнительные сведения см. в разделе Индексаторы в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

Источник

Индексаторы

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

Одномерные индексаторы

Общая форма одномерного индексатора:

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

В теле индексатора определены два аксессора (средства доступа к данным, см. также статью о свойствах): get и set. Аксессор подобен методу, за исключением того, что в нем не объявляется тип возвращаемого значения или параметры. Аксессоры вызываются автоматически при использовании индексатора, и оба получают индекс в качестве параметра. Так, если индексатор указывается в левой части оператора присваивания, то вызывается аксессор set и устанавливается элемент, на который указывает параметр индекс. В противном случае вызывается аксессор get и возвращается значение, соответствующее параметру индекс. Кроме того, аксессор set получает неявный параметр value, содержащий значение, присваиваемое по указанному индексу.

Давайте рассмотрим пример:

зачем нужны индексаторы c. 316. зачем нужны индексаторы c фото. зачем нужны индексаторы c-316. картинка зачем нужны индексаторы c. картинка 316.

В текущем классе MA определен индексатор а1, позволяющий вызывающему коду идентифицировать элементы (объекты) с применением числовых значений индекса (как в массиве). В статье Массивы найдите пример с объявлением массива объектов, сравните коды и найдите отличия.

На применение индексаторов накладываются два существенных ограничения. Во-первых, значение, выдаваемое индексатором, нельзя передавать методу в качестве параметра ref или out, поскольку в индексаторе не определено место в памяти для его хранения. И во-вторых, индексатор должен быть членом своего класса и поэтому не может быть объявлен как static.

Многомерные индексаторы

Пример индексатора, принимающего несколько параметров:

зачем нужны индексаторы c. 317. зачем нужны индексаторы c фото. зачем нужны индексаторы c-317. картинка зачем нужны индексаторы c. картинка 317.

После инициализации индексатора далее с ним можем работать как с двухмерным массивом целых чисел. Небольшой плюс индексатора: размерности (число строк и столбцов) являются членами класса. Замените 2 строку в методе Main( ) на:

т.е. объявим массив a2. Тогда в задании верхних границ индексов будет ошибки типа:

«System.Array» не содержит определения для «r» и не был найден метод расширения «r», принимающий тип «System.Array» в качестве первого аргумента.

Впрочем, если объявите класс МА3:

и внесете изменения в вызов элементов массива (выделено красным):

то вы получите практически тоже, что и с индексатором. Плюс только в том, что вы обращаетесь к элементу индексатора a2[i, j], а к элементу массива через поле ar: a2.ar[i, j].

Источник

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

читаю код и наткнулся на этот фрагмент, который я раньше не видел:

похоже, что он называется следующим образом:

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

11 ответов

см. спецификацию языка, раздел 10.9, в котором говорится:

An индексатор является членом, который позволяет индексировать объект так же, как массив.

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

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

что касается меня, вот мотивация использовать индексатор:

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

Надежда эта помощь.

во многих случаях синтаксис «индекса» имеет большой смысл. Это особенно полезно, если SomeClass представляет собой какую-то коллекцию.

Он позволяет выполнять поиск ассоциативного массива (a.к. a. «стиль словаря»), как вы упомянули в своем вопросе.

и в этом весь смысл. Некоторым людям это нравится, особенно людям, которые происходят из языков, в которых он встроен, таких как Python или PHP

ключевое слово «this» является индексатором

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

возможно, вы уже наткнулись на что-то подобное раньше:

Это перегрузка оператора. Полезно, если вы пишете класс коллекции, например, где имеет смысл получить к нему доступ с помощью нотации массива, например collection[someIndex].

вы, конечно, можете написать коллекцию.Функция GetElement(someIndex) эквивалентна, но это стиль/читаемость.

Ну, вы можете использовать этот метод в классе пары ключ-значение.

Я не уверен, что аналогичный класс находится в c#, но в C++ STL есть класс map, где вы вызываете метод с SomeObject[«key»] и он вернет «значение», связанное с этим ключом.

Это называется индексатором, они позволяют использовать List, ArrayList, Dictionary и все другие коллекции, используя синтаксис массива.

Это просто синтаксический сахар, но он дает некоторую читаемость при правильном использовании.

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

где бы вы пользу из нее:

как вы можете видеть, по какой-то причине ваши данные являются словарем, индексированным строковым ключом, и вы хотите назвать это двумя целочисленными индексами и все еще не хотите менять тип данных:

Источник

Классы и объекты C#: индексаторы

Формальное определение индексатора в C# выглядит следующим образом:

Пример индексатора в C#

Конструкция public Person this[int index] представляет собой индексатор. Здесь определяем:

Аналогично и с присваиванием значения. В блоке set мы получаем через параметр value переданный объект Person и сохраняем его в массив по индексу.

При выводе имени человека в консоль мы использовали оператор условного null.

Применение нескольких параметров в индексаторе C#

Индексатор может принимать несколько параметров. Допустим, у нас имеется класс, в котором хранение данных определено в виде двухмерного массива:

При этом индексаторы могут быть виртуальными и абстрактными и могут переопределяться в классах-наследниках.

Блоки get и set индексаторов C#

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

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

В данном случае класс People содержит две версии индексатора. Первая версия получает и устанавливает объект Person по индексу, а вторая — только получает объект Person по его имени.

Итого

Индексаторы по своему описанию очень походи на свойства классов, но, при этом, не имеют названия (имени). Индексаторы в C# позволяют использовать объекты как обычные массивы. Используя индексатор, мы можем упростить код и обращаться к внутренней коллекции объекта также, как мы бы обращались к элементам массива по их индексу. Кроме этого, с помощью индексаторов можно добавлять свою логику при получении или записи данных во внутреннее хранилище объекта.

Источник

Добавить комментарий

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