Volatile 15 страница.
· метод доступа 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.4.2. 10.10 Операторы; Оператор является членом, определяющим значение оператора выражения, который можно применить к экземплярам класса. Операторы объявляются с помощью объявлений_операторов: объявление_оператора: модификаторы_оператора: модификатор_оператора: декларатор_оператора: декларатор_унарного_оператора: перегружаемый_унарный_оператор: одно из декларатор_бинарного_оператора: перегружаемый_бинарный_оператор: декларатор_оператора_преобразования: тело_оператора: Есть три категории перегружаемых операторов: унарные операторы (§10.10.1), бинарные операторы (§10.10.2) и операторы преобразования (§10.10.3). Если в объявление оператора включен модификатор extern, оператор называется внешним оператором. Так как внешний оператор не предоставляет фактическую реализацию, его тело_оператора состоит из точки с запятой. Для всех других операторов тело_оператора состоит из блока, в котором указаны операторы, выполняемые при вызове этого оператора. Блок оператора должен удовлетворять правилам для методов, возвращающих значение, описанным в §10.6.10. Следующие правила применяются ко всем объявлениям операторов: · объявление оператора должно включать оба модификатора: public и static; · параметрами оператора должны быть параметры-значения. Указание в объявлении оператора параметров ref или out является ошибкой времени компиляции; · подпись оператора (§10.10.1, §10.10.2, §10.10.3) должна отличаться от подписей всех других операторов, объявленных в этом же классе; · все типы, на которые ссылается объявление оператора, должны быть по крайней мере так же доступными, как сам оператор (§3.5.4); · неоднократное появление одного и того же модификатора в объявлении оператора является ошибкой времени компиляции. Каждая категория операторов налагает дополнительные ограничения, как описано в следующих разделах. Подобно другим членам, операторы, объявленные в базовом классе, наследуются производными классами. Так как объявления операторов всегда требуют участия класса или структуры, где объявлен оператор, в подписи оператора, то для оператора, объявленного в производном классе, невозможно скрыть оператор, объявленный в базовом классе. Таким образом, модификатор new никогда не требуется и поэтому никогда не допускается в объявлении оператора. Дополнительные сведения об унарных и бинарных операторах можно найти в §7.2.
|