ГЛАВНАЯ     АРХИВ     НАПИСАТЬ АДМИНУ     ПОДПИСАТЬСЯ НА RSS     ВОЙТИ      

Поиск

Категории

Облако тегов

acer ado.net amd asp.net c sharp c# cms css exceptions google html ipad iphone it бизнес javascript jquery linq microsoft mysql net nokia nokia lumia samsung seo silverlight sql surface tsql windows 8 windows blue windows phone windows rt xna безопасность библиотека вопросы на собеседовании интересные проекты интернет интернет магазин исключения книга книги компьютерная безопасность компьютерные игры контролы курсы по программированию логированние исключений мобильные приложения монетизация сайтов наушники новости новости it новости microsoft новости интернет новости технологий ноутбук ноутбуки обработка исключений оптимизация острова периферия планшет планшеты поддержка сайтов поисковое продвижение программы продвижение продвижение сайта продвижение сайтов рабство разработка игр разработка сайтов раскрутка сайта рекламные технологии смартфон смартфоны собеседование создание сайтов средства разработки туризм фриланс хостинг яндекс
  << Предыдущий пост       Следующий пост >>  
От: ironMan
15. августа 2011 18:22

Как уже было сказано выше, индексаторы очень похожи на свойства.
Формально синтаксис определения индексатора таков:

[атрибуты] [модификаторы] тип this [список-формальных-параметров] { set get }

Или, если это индексатор в интерфейсе, таков:

[атрибуты] [модификаторы] тип интерфейс.this [список формальных параметров] { set get }

Где:

АТРИБУТЫ — дополнительная информация об индексаторе. Наиболее значимым для индексаторов является атрибут Name. Задание Name позволяет дать имя индексатору для того, чтобы его могли использовать другие языки, не поддерживающие индексаторы. По умолчанию все индексаторы вашего класса имеют Name, равный Item;

МОДИФИКАТОРЫ — модификаторы доступа и директивы. К индексатору применимы почти все стандартные директивы С#. Он может быть скрыт, перегружен, сделан виртуальным, но есть одно исключение, индексатор не может быть static;

СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ — указывает параметры, посредством которых осуществляется индексация. Передается в get и set, которые используются в индексаторе так же, как в свойствах, get применяется для вычисления индексатора по заданному списку формальных параметров, a set — для изменения индексатора, set получает в качестве дополнитель-
ного параметра value того же типа, что и индексатор.

Следует отметить, что доступ к индексатору осуществляется посредством сигнатуры, в отличие от свойства, доступ к которому осуществляется посредством имени. Сигнатурой индексатора считаются число и тип формальных параметров. Тип самого индексатора и имена параметров в сигнатуру не входят. Естественно, в классе не может быть двух индексаторов с одинаковой сигнатурой. К тому же, индексатор не считается переменной и не может быть передан в качестве ref или out параметра. Вот пример простейшего класса, использующего индексатор.



class MyArray
{
public object this fint idx]
{
get
{
/* return some value */
}
set
{
/* set some value */
}
}
}



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



МуAггау obj = new MyArrayO;
obj[0] = someObj;
Console.WriteLine{"{0}", obj[0]);



Клиентская часть программы не заботится о том, что возвращает индексатор. Все, что делается внутри индексатора, не имеет значения для клиентского кода. Клиент лишь ожидает от индексатора такого значения, как если бы он обращался к элементу массива. Давайте рассмотрим пример использования индексатора:



using System;
using System.Collections;

namespace Indexers
{
class ListBox
{
protected ArrayList data = new ArrayList()
public object this [int idx]
{
get
{
/* return some value */
if(idx > -1 &s idx < data.Count)
{
/* valid situation */
return data[idx];
}
else
{
/* wrong situation */
/* throw exception */
return null;
}
}
set
{
/* set some value */
if(idx > -1 && idx < data.Count)
{
data[idx] = value;
}
else
{
if(idx == data.Count)
{
data.Add(value);
}
else
{
/* wrong situation */
/* throw exception */
}
}
}
}
}
}

class ListBoxApp
{
static void Main(string[] args)
{
ListBox list = new ListBox() ;
list[O] = " к р а с н ы й " ;
list[1] = " з е л е н ы й " ;
list[2] = " с и н и й " ;
Console.WriteLine( "{0} {1} {2}", list[0], list[1], list[2] );
}
}



Созданный нами класс ListBox имеет индексатор. Сам класс предназначен для хранения списка объектов. Класс ArrayList библиотеки классов .NET Framework предназначен для хранения совокупности объектов. Объект data типа ArrayList является членом класса ListBox. В моей реализации класса ListBox выполняется лишь проверка на выход индекса за границы допустимых значений и генерация исключения в случае необходимости. Вы можете расширить реализацию индексатора любыми дополнительными функциями. Например, добавить функцию отображения добавленного в список элемента на экране. От этого не изменится код клиентской части программы. Вам лишь необходимо будет изменить внутреннюю реализацию индексатора.

( отрывок из книги В. В. Лабор "Си Шарп: Создание приложений для Windows" )

 

Похожие записи


Многопоточный HTTP сервер на C#
Оригинал статьи здесь: Многопоточный сервер на C# за 15 минут Автор (на хабре): ertaquo C# довольно простой и гибкий язык. Вместе с .NET поставляется довольно много уже готовых классов, что делает его еще проще. Настолько, что вполне можно написать простой многопоточный HTTP-сервер для отдачи статического содержимого всего за 15 минут. Можно было бы использовать уже...

Нейгел, Ивьен, Глинн, Уотсон, Скиннер - C# 2008 и платформа .NET 3.5
Название: C# 2008 и платформа .NET 3.5 для профессионалов Авторы: Нейгел, Ивьен, Глинн, Уотсон, Скиннер Издательство: Вильямс ISBN: 978-5-8459-1458-3 Год: 2008 Страниц: 1392 От издателя: Эта книга является совершенным руководством по языку C# 2008 и его среде. Она обновлена с учетом вышедших версий .NET 3.5 и Visual Studio 2008. Начиная с обзора и архитектуры ...

Виртуальные свойства в C#
Свойства, как и методы, могут быть перегружены в производных классах. Для свойств также могут задаваться модификаторы virtual, override или abstract. Подробно о наследовании говорилось в главе «Методы», сейчас я лишь хочу еще раз привести подробный пример использования механизма виртуализации с применением свойств: [code:c#] using System; enum COLORS { RE...

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




biuquote
  • Комментарий
  • Предпросмотр
Loading


  Сохранить комментарий