Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Свойства с параметрами



Свойства с параметрами в С# называются индексаторы и позволяют создавать пользовательские классы-контейнеры, к внутренним элементам которых можно обращаться при помощи того же оператора индекса ([]), что и к элементам обычного массива встроенных типов. Создание метода индексатора в С# очень похоже на перегрузку оператора квадратных скобок в С++.

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

Индексаторы могут характеризоваться одной или несколькими размерностями.

Одномерный индексатор имеет следующий формат.

тип_элемента this [int индекс ] {

get { // Возврат значения, заданного элементом индекс }

set { // Установка значения, заданного элементом индекс }

}

Здесь тип элемента - базовый тип индексатора - тип каждого элемента, к которому предоставляется доступ посредством индексатора. Он соответствует базовому типу массива. Параметр индекс получает индекс запрашиваемого (или устанавливаемого) элемента. Этот параметр не обязательно должен иметь тип int, но поскольку индексаторы обычно используются для обеспечения индексации массивов, целочисленный тип - наиболее подходящий.

В теле индексатора определяются два аксессора (средства доступа) с именами get и set. При использовании индексатора аксессоры вызываются автоматически, и в качестве параметра оба аксессора принимают значение индекс.

Если индексатор стоит слева от оператора присваивания, вызывается аксессор set и устанавливается элемент, заданный параметром индекс. В противном случае, вызывается аксессор get и возвращается значение, соответствующее параметру индекс. Метод set также получает значение (именуемое value), которое присваивается элементу массива, найденному по заданному индексу.

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

Например, контролировать выход за границы массива,

using System;

class Demo {

private int[] IntArray;

public Demo(int size)

{IntArray=new int[size];

for (int i = 0; i < size; i++) IntArray [i] = i;}

public int this[int index]

{ get { return IntArray [index]; }

set { IntArray[index] = value; }

}

}

class X

{ public static void Main()

{ Demo ob = new Demo(8);

ob[6]=29;

Console.WriteLine(ob[6]);

}

}

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

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

Индексаторы необязательно создавать с поддержкой как get-, так и set-аксессоров. Можно создать индексатор, предназначенный только для чтения, реализовав лишь get-аксессор. И точно также можно создать индексатор, предназначенный только для записи, реализовав лишь set-аксессор.

В С# допускается определять индексаторы только на экземплярах объектов. В С# нет синтаксиса, позволяющего разработчику определять статическое свойство-индексатор, хотя на самом деле CLR поддерживает статические свойства с параметрами. Поскольку CLR обрабатывает свойства с параметрами и без них одинаково, компилятор генерирует в результирующем управляемом модуле те же три элемента:

• метод-аксессор set свойства с параметрами - генерируется, только если у свойства определен аксессор set;

• метод-аксессор get свойства с параметрами - генерируется, только если у свойства определен аксессор get;

• определение свойства в метаданных управляемого модуля - генерируется всегда.

Компилятор автоматически генерирует имена для этих методов, добавляя к Item префикс get или set. Поскольку синтаксис индексаторов в С# не позволяет разработчику задавать имя, создателям компилятора С# пришлось выбирать имя методов- аксессоров, и они выбрали Item.

В приведенном выше примере, компилятор сгенерирует следующие методы:

get_Item(Int32 index)

set_Item(Int32 index, Int32 value)

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

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

В примере определения класса IntArray можно перегрузить индексатор для индексов типа double, public int this[double index]

{ get{ int x = (int)index; // Округление до ближайшего целого int-значения.

if ((index - x) > 0.5) x++;

return IntArray[xj;}

set{ int x = (int)index; // Округление до ближайшего целого int-значения.

if ((index-х)> 0.5) x++;

IntArray [x| = value;}

}

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

ob[6.8] = 29;

Будет вызван double-индексатор, и будет изменен элемент массива с индексом 7.

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





Дата публикования: 2015-09-18; Прочитано: 337 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...