Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Вопрос? Индексаторы


Автор: Neuromancer 1.9.2006, 12:17
Прошу учесть я в программировании совсем зеленый потихоньку продвигаюсь, конечно, ну вопросов ну просто море  smile  хочу выучить С# тяжко уж как-то  без знания языка  программирования хоть один язык выучить (ну вот еще один решил пополнить ряды NET программистов) ну вот решил изучать, а для общения и поднятия квалификации выбрал САМЫЙ ЛУЧШИЙ ФОРУМ В СЕТИ ЭТО- http://forum.vingrad.ru – кстати я недавно наткнулся в сети на ВИНОГРАД и когда увидел у меня чуть глаз не выпал  smile  тут есть все
и  .NET и PHP и Базы данных ну очень много всего интересного взять бы и все созданные темы прочитать такой объем информации  жаль, человек ограничен по времени закачать бы всю эту базу форумов прямо в мозг  smile   
отвлекся малость   smile   
Собственно сам вопрос, что такое ИНДЕКСАТОРЫ для чего они вообще нужны, и как их использовать не забывайте я новичок, опишите, чтоб все понятно было, разложите по полочкам теорию и + какой нибуть пример с хорошо прокоментированным кодом.

Автор: ivashkanet 1.9.2006, 12:51
Neuromancer, вступление мне понравилось  smile , но...

Все что ты просишь объснить --- очень подробно объяснено в книгах/учебниках по C#.
Ты хочешь чтобы мы привели цытаты?

Neuromancer, мой совет, возми любую книгу (лучше всего http://dm9.ru/vingrad/books_from_medigo_ru/candnet.zip), там все подробно об этом написано  smile 

Ну либо если хочешь все сейчас: http://www.intuit.ru/department/pl/csharp/16/3.html


Автор: marcusmae 1.9.2006, 13:03
Попробую состроить из себя ivashkanet smile (в хорошем настроении)
Если речь идёт о свойствах-индексаторах, то на пальцах объяснил бы примерно так.
Пусть есть объект, который ты хочешь запрограть в библиотеку, и этот объект изначально подразумевает множественность. Допустим... сороконожка  smile Нелогично заставлять пользователя думать о ней, как о массиве ног, правда?;) Например, на такой случай можно употребить в классе индексатор :

Код

public class Сentipede
{
     // массив ног
     private Leg[] legsArray;

     // свойство-индексатор ног
     public Leg this[int index]
     {
           get { return this.legsArray[index]; }
           set { this.legsArray[index] = value; }
     }
     
     public Body body;
     // ... другие члены класса
}

public Leg
{
    public bool IsLeft;
    public bool IsRight;
    ...
}


Таким образом, получается возможность скрыть от детей и беременных женщин твою живодёрскую манеру хранить ноги где-то там в отдельном массиве, и получить ногу можно будет только по этому свойству-индексатору :

Код

Centipede centipede = new Centipede(...);
...
// получаем в переменную одну из ног
Leg leg = centipede[39];
// что-нить делаем
if (leg.IsRight) Console.WriteLine("Поздравляем, сегодня ты встала с той ноги!");


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

Код

     // свойство-индексатор ног
     public Leg this[int index]
     {
           get { return this.legsArray[index]; }
           set
           {
                 if (index < 40)
                     this.legsArray[index] = value;
                 else throw new ArgumentException("Дополнительные ноги не могут быть установлены.");
           }
     }


Более того, массива, который скрывается за свойством в этих примерах, может вообще не быть! = То есть, со стороны свойство-индексатор представляет какие-то элементы, как массив, но на самом деле они хранятся как-то иначе. На жирафах пример придумать не сумел, но напиши дополнительно, если не понятно.

Автор: reloni 1.9.2006, 13:04
Индексаторы позволяют обращаться к полям твоего класса так же, как к массиву. 
Код

// массив
int[] arrray = new int[10];
// ...
// обращение к элементу массива через индекс
Console.WriteLine(array[5]);

Тоже самое можно сделать для своего класса.

class SimpleClass
{
    private ArrayList _array = new ArrayList();

    public SimpleClass()
    {
        this._array.Add("Москва");
        this._array.Add("Санкт-Петербург");
        this._array.Add("Калининград");
        this._array.Add("Астана");
    }

                // this означает, что это индексатор
    public string this[int index]
    {
        get 
        {
            if (index < this._array.Count  && index >= 0)
            {
                return this._array[index].ToString();
            }
            else
                throw new Exception();
        }
    }
}

public string this[int index]
Данный индексатор принимает один параметр типа int (может принимать больше одного), а возвращает string, в нашем случае название городаsmileтакже мы генерируем исключение, если индекс меньше нуля, или выходит за границы массива.

Код

SimpleClass cl1 = new SimpleClass();
Console.WriteLine(cl1[2]);
// выведет на консоль Калининград
Console.WriteLine(cl1[6]);
// исключение, в массиве нет элемента с таким индексом


Данный пример надуман, но как пример работы подходит я думаюsmile

ps если мне не изменяет память, то в Троелсене ничего про индексаторы нет, во всяком случае вспомнить не могу.


Пока писал, уже опередили меняsmile

Автор: ivashkanet 1.9.2006, 13:15
 smile 
Цитата(marcusmae @  1.9.2006,  13:03 Найти цитируемый пост)
Попробую состроить из себя ivashkanet 

smile А я тут причем smile 
И причем тут настроение? 
Понятно причем  smile 
У меня был только что митинг с заказчиком, вот я и злой на всех него  smile 
Прошу меня простить. А с утра я действительно мог чё-нить толковое написать
 smile  smile  smile 
P.S. А по сути я прав. Neuromancer, вот если бы спросил так: 
"Я вот прочитал про индексаторы, но ничего не понял smile Почему тут так и так и нафига нам такая вот штука, да и что вот это значит вообще..."
В общем, перед тем как спрашивать нужно было самому что-нить почитать  smile 

P.P.S. 
Цитата(reloni @  1.9.2006,  13:04 Найти цитируемый пост)
ps если мне не изменяет память, то в Троелсене ничего про индексаторы нет, во всяком случае вспомнить не могу.

226 страница  smile 

Автор: reloni 1.9.2006, 13:21
Цитата(ivashkanet @  1.9.2006,  13:15 Найти цитируемый пост)
226 страница    

Действительноsmile
А я уже было думал, как он мог это упустить.

Автор: VisualProgrammerNET 1.9.2006, 14:02
Цитата(marcusmae @  1.9.2006,  13:03 Найти цитируемый пост)
"Дополнительные ноги не могут быть установлены."


 smile  smile  smile   smile 

Автор: Neuromancer 1.9.2006, 14:04
Спасибки всем огромное  я читал "Шилдг Г.Полный справочник по С#" но не до конца все понял в индексаторах, хотел, чтоб вы своими словами получше объяснили 
в следующий раз я буду поподробней писать, что я прочитал, и что я конкретно не понял (ой замучаю я вас своими вопросами  smile всех я вас очень понимаю, все мы иногда злые или добрые или некоторых бесит новички со своими глупыми вопросами  smile Всем еще раз огромное спасибо за помощь за совет и за ругань тоже. smile Я не просто спрашиваю, я читаю и если что-то не понятно я спрашиваю, извиняюсь 
что конкретнее вопрос не поставил, в следующем я все учту.
Да кстати спасибки за книжечку скал  smile 



"... то, что ты получаешь от общества, будет обществом в тебе и для тебя, 
так же как то, что ты даешь ему, будет твоим в обществе и для общества. 
Стремись получить от общества все, но не давай ему порабощать 
себя и не отдавайся ему полностью".
                                                                М. де Унамуно

жажда знаний, присущая всем людям, представляет собой неизлечимую болезнь.

Человек смертен, человечество бессмертно; человек ограничен, человечество обладает способностью к бесконечному развитию.
                       МИХОЭЛС С.М.

...Не имеет значения, что кто-либо говорит или делает...
              Т_ы_  с_а_м_ должен быть безупречным человеком...
                  ...Нам требуется все наше  время и вся
              наша  энергия, чтобы победить идиотизм в себе. Это
              и есть то,  что имеет значение.  Остальное  не имеет никакой
              важности...
                                                                  Дон Хуан
                                      (К. Кастанеда  "Второе Кольцо силы")

Автор: ivashkanet 1.9.2006, 14:10
Цитата(Neuromancer @  1.9.2006,  14:04 Найти цитируемый пост)
ой замучаю я вас своими вопросами

Не волнуйся, нас просто так не возьмешь  smile 
Цитата(Neuromancer @  1.9.2006,  14:04 Найти цитируемый пост)
некоторых бесит новички со своими глупыми вопросами 

Некоторых (меня в частности) бесит не глупые вопросы, это не страшно, а нежелание думать самому (к тебе это не относится  smile , но я подумал, что ты один из них  smile ) smile 
Так что обращайся --- всегда рады помочь smile 
P.S. Всегда рады новым людям. Добро пожаловать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)