Volatile 15 страница
Модификаторы virtual, override и abstract являются взаимоисключающими, кроме как в одном случае. Модификаторы abstract и override могут использоваться совместно, так чтобы абстрактный индексатор мог переопределить виртуальный. Тип; в объявлении индексатора указывает тип элемента индексатора, вводимого объявлением. Если только индексатор не является явной реализацией члена интерфейса, за типом; следует зарезервированное слово this. Для явной реализации члена интерфейса за типом; следует тип_интерфейса;, «.» и зарезервированное слово this. В отличие от других членов, индексаторы не имеют имен, определяемых пользователем. Список_формальных_параметров; указывает параметры индексатора. Список формальных параметров индексатора соответствует списку формальных параметров метода (§10.6.1), кроме того, что по крайней мере один параметр должен быть указан, а модификаторы параметров ref и out не разрешены. Тип; индексатора и каждый из типов, на которые есть ссылки в списке_формальных_параметров;, должны быть по крайней мере так же доступными, как сам индексатор (§3.5.4). Объявления_методов_доступа; (§10.7.2), которые должны быть заключены в лексемы «{" и "}», объявляют методы доступа индексатора. Методы доступа указывают исполняемые операторы, связанные с чтением и записью элементов индексатора. Хотя синтаксис доступа к элементу индексатора такой же, как синтаксис доступа к элементу массива, элемент индексатора не классифицируется как переменная. Так, невозможно передать элемент индексатора в качестве аргумента ref или out. Список формальных параметров индексатора определяет подпись (§3.6) индексатора. В частности, подпись индексатора состоит из числа и типов его формальных параметров. Тип элемента и имена формальных параметров не являются частью сигнатуры индексатора. Сигнатура индексатора должна отличаться от сигнатур всех других индексаторов, объявленных в этом же классе. Понятия индексаторов и свойств очень схожи, но отличаются следующим: · свойство идентифицируется своим именем, а индексатор идентифицируется своей подписью; · доступ к свойству производится через простое_имя; (§7.6.2) или доступ_к_члену; (§7.6.4), а доступ к элементу индексатора производится через доступ_к_элементу (§7.6.6.2); · свойство может быть static членом, а индексатор всегда является членом экземпляра; · метод доступа get свойства соответствует методу без параметров, тогда как метод доступа get индексатора соответствует методу с тем же списком формальных параметров, что у индексатора; · метод доступа set свойства соответствует методу с одним параметром с именем value, тогда как метод доступа set индексатора соответствует методу с тем же списком формальных параметров, что у индексатора, плюс дополнительный параметр с именем value; · объявление в методе доступа к индексатору локальной переменной с тем же именем, что и параметр индексатора, является ошибкой времени компиляции; · в объявлении переопределяющего свойства при обращении к унаследованному свойству используется синтаксис base.P, где P – имя свойства. В объявлении переопределяющего индексатора при обращении к унаследованному индексатору используется синтаксис base[E], где E – список выражений, разделенных запятыми. За исключением этих различий, все правила, определенные в §10.7.2 и §10.7.3, применяются к методам доступа к индексатору, а также к методам доступа к свойствам. Если в объявление индексатора включен модификатор extern, индексатор называется внешним индексатором. Так как объявление внешнего индексатора не предоставляет фактической реализации, каждое из его объявлений_метода_доступа; состоит из точки с запятой. В примере внизу объявлен класс BitArray, реализующий индексатор для доступа к отдельным битам в битовом массиве. using System; class BitArray public BitArray(int length) { public int Length { public bool this[int index] { Экземпляр класса BitArray расходует существенно меньше памяти, чем соответствующий bool[] (так как каждое значение первого занимает только один бит, тогда как у второго – один байт), но позволяет выполнять те же операции, что и bool[]. В следующем классе CountPrimes используется BitArray и классический алгоритм «решето» для вычисления количества простых чисел между 1 и заданным максимумом. class CountPrimes static void Main(string[] args) { Обратите внимание, что синтаксис обращения к элементам BitArray точно такой же, как для bool[]. В следующем примере показан класс сетки 26 ґ 10 с индексатором с двумя параметрами. Первым параметром должна быть буква верхнего или нижнего регистра в диапазоне A–Z, а вторым – целое число в диапазоне 0–9. using System; class Grid int[,] cells = new int[NumRows, NumCols]; public int this[char c, int col] { set { 10.9.1 Перегрузка индексатора Правила разрешения перегрузки индексаторов описаны в §7.5.2. 10.10 Операторы; Оператор является членом, определяющим значение оператора выражения, который можно применить к экземплярам класса. Операторы объявляются с помощью объявлений_операторов;: объявление_оператора: модификаторы_оператора:
|