-
Сборник процесса реализации индексатора на C#
Одним из наиболее интересных аспектов языка C# является индексатор классов. Проще говоря, так называемый индексатор — это особый тип атрибута, с помощью которого вы можете ссылаться на свой собственный класс, как на массив. Очевидно, что эта функция особенно полезна при создании классов-коллекций, но в других ситуациях, таких как обработка больших файлов или абстрагирование определенных ограниченных ресурсов, конечно, также очень полезно иметь в классе поведение, подобное массиву. В этой статье вы узнаете, как настроить класс для использования индексатора. Но сначала давайте обрисуем концепцию свойств, чтобы обеспечить некоторую необходимую информацию.
Свойства. Если вы когда-либо писали программу на VB6, то вы должны быть хорошо знакомы с методами свойств. Так называемые методы свойств на самом деле представляют собой специальные члены класса, которые реализуют контролируемый доступ к частным полям класса. В языке C# существует два метода атрибутов: один — get, с помощью которого можно вернуть значение частного поля, а второй — set, с помощью которого можно установить значение частного поля. Например, на примере следующего кода создается свойство FirstName для управления доступом к имени частного члена класса:
класс Человек {
частная строка имя;
общедоступная строка FirstName {
получить {вернуть имя;}
установить {имя = значение;}
}
}
Объявления свойств могут быть закодированы следующим образом:
Человек р = новый Человек ();
p.FirstName = "Ламонт";
Console.WriteLine(p.FirstName);
Как видите, объявление атрибута больше похоже на объявление домена, за исключением того, что оно также объявляет два специальных члена, которые, по мнению Microsoft, являются так называемыми аксессорами. Функция доступа get вызывается, когда свойство вызывается в правой части выражения или когда свойство используется в качестве параметра другой подпрограммы (или функции). И наоборот, функция доступа set вызывается, когда свойство вызывается в левой части выражения, а значение частного поля устанавливается путем неявной передачи параметра value. Вы можете создать свойства, доступные только для чтения, опустив функцию доступа set, так что любая попытка установить свойство приведет к ошибке компиляции.
Преимущества использования индексаторов
Ниже приведена его структура
<модификатор> <тип возвращаемого значения> этот [список аргументов]
...{
получать
...{
// Здесь находится получение кодов
}
набор
...{
// Здесь находятся коды установки
}
}
Примечание:
модификатор: модификатор, например частный, общедоступный, защищенный или внутренний
this: это специальное ключевое слово в C#, которое представляет текущий экземпляр ссылочного класса. Здесь имеется в виду индекс текущего класса.
список аргументов: относится к параметрам индексатора.
После долгого разговора перейдем к теме, так почему же я должен ходить по этому кругу? Фактически, это связано с тем, что индексатор класса очень похож на свойство, и это также справедливо с точки зрения кода. Вот пример класса с индексатором, который возвращает строку:
класс Образец {
публичная строка this [int index] {
get {return «Вы прошли» + index }
}
}
Обратите внимание, что здесь используется имя атрибута this, которое относится к текущему экземпляру класса, а список параметров заключен в квадратные скобки, а не в круглые скобки. Кроме того, это индексатор, доступный только для чтения. Чтобы изменить его на тип чтения/записи, я добавил функцию доступа к набору. При определении индексатора не обязательно использовать только один параметр. Параметры индексатора могут быть любого типа, но обычно наиболее подходящим типом является int. Также возможно иметь более одного индексатора (перегруженного) в одном классе.
После определения класса Sample, как указано выше, мы можем использовать индексатор в качестве атрибута по умолчанию, как показано ниже:
Образец s = новый образец();
Console.WriteLine(s[55]);
Свойства и индексаторы Существует несколько различий между свойствами и индексаторами:
Каждый атрибут класса должен иметь уникальное имя, а каждый индексатор, определенный в классе, должен иметь уникальную сигнатуру или список параметров (чтобы можно было реализовать перегрузку индексатора).
Свойства могут быть статическими, а индексаторы должны быть членами экземпляра.
Функции доступа, определенные для индексаторов, имеют доступ к параметрам, передаваемым индексатору, тогда как функции доступа к свойствам не имеют параметров.
Разработчики программ часто отдают предпочтение массивовому поведению интерфейсов, поэтому вы также можете определить индексаторы для интерфейса. И интерфейсы коллекций IList, и IDictionary объявляют индексаторы для доступа к своим сохраненным элементам.
Объявляя индексатор для интерфейса, помните, что объявление указывает только на существование индексатора. Вам нужно только предоставить соответствующие функции доступа, не включая модификаторы области. Следующий код объявляет индексатор как часть интерфейса IImplementMe:
интерфейс IIimplementMe {
строка this[int index]
{
получать;
набор;
}
Соответствующий реализованный класс должен конкретно определить функции доступа get и set для индексатора IimplementMe.
Это базовый обзор индексаторов. Теперь вы должны лучше понимать роль индексаторов в вашем развитии.
класс SampleCollection<T>
{
частный T[] arr = новый T[100];
общественное T это [int i]
{
получать
{
вернуть arr[i];
}
набор
{
arr[i] = значение;
}
}
}
// Этот класс показывает, как клиентский код использует индексатор
классная программа
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = новая SampleCollection<string>();
stringCollection[0] = "Привет, мир";
System.Console.WriteLine(stringCollection[0]);
}
}
Эта статья взята из блога CSDN. При перепечатке указывайте источник: http://blog.csdn.net/licheng19891020/archive/2009/12/09/4974516.aspx.
-