Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Финал
2 / 2 / 2
Регистрация: 11.09.2013
Сообщений: 70
1

Как работают индексаторы?

02.04.2014, 20:50. Просмотров 789. Ответов 4
Метки нет (Все метки)

Здравствуйте дорогие друзья!
Изучаю Книгу Герберта Шилдта. Остановился на индексаторах. И никак не могу понять принцип работы.
Вот программка которая должна выводить ошибки если превышен размер массива.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System;
class failsoftDemo
{
    int[] a;
    int len;
    bool errflag;
 
    public failsoftDemo(int size)
    {
        a = new int[size];
        len = size;
    }
    public int Lenght
    {
        get
        {
            return len;
        }
        set
        {
            len = value;
        }
    }
    public bool Error
    {
        get
        {
            return errflag;
        }
    }
    public int this[int index]
    {
        get
        {
            if (ok(index))
            {
                errflag = false;
                return a[index];
            }
            else
            {
                errflag = true;
                return 0;
            }
        }
        set
        {
            if (ok(index))
            {
                a[index] = value;
                errflag = false;
            }
            errflag = true;
        }
    }
 
    private bool ok(int index)
    {
        if ((index >= 0) & (index < Lenght)) return true;
        else return false;
    }
}
class fsdemo
{
    static void Main()
    {
        failsoftDemo fs = new failsoftDemo(5);
        int x;
        
        Console.WriteLine();
 
 
        
 
        for (int i = 0; i < fs.Lenght * 2; i++)
        {
            
             fs[i]=i;
            
            if (fs.Error) Console.WriteLine("fs["+i+"]-ошибки");
            else Console.WriteLine("fs[" + i + "]");
            
        }
 
 
        Console.ReadKey();
    }
}

на деле же компилятор выводит
fs[0]-ошибки
fs[1]-ошибки
fs[2]-ошибки
fs[3]-ошибки
fs[4]-ошибки
fs[5]-ошибки
fs[6]-ошибки
fs[7]-ошибки
fs[8]-ошибки
fs[9]-ошибки
Блин да почему так то? В книги этот момент не описывается.
Если в конце изменить не много цикл вот так.
C#
1
2
3
4
fs[i]=i;
             x = fs[i];
            if (fs.Error) Console.WriteLine("fs["+i+"]-ошибки");
            else Console.WriteLine("fs[" + i + "]");
То компилятор выведет желаемый результат:
fs[0]
fs[1]
fs[2]
fs[3]
fs[4]
fs[5]-ошибки
fs[6]-ошибки
fs[7]-ошибки
fs[8]-ошибки
fs[9]-ошибки

Ребят обьясните нубу как работа.т эти индексаторы не могу двигаться дальше
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2014, 20:50
Ответы с готовыми решениями:

Как реализовать доступ используя индексаторы?
Здравствуйте. Дали такое задание: Класс А предназначен для хранения...

Индексаторы
Завдання Клас інкапсулює одновимірний масив з елементів цілого типу. Створити...

Индексаторы
Добрый день. Имеется код struct Cell { Rectangle...

Индексаторы в С#
Помогите реализовать задачу. Задача звучит так: Класс инкапсулирует одномерный...

Индексаторы, свойства
есть string ms внутриего лежат слова 1) есть сво-во Site - возврощет...

4
tranquil
51 / 51 / 10
Регистрация: 26.09.2013
Сообщений: 277
02.04.2014, 21:50 2
в Шилдте все части данной программы объясняются очень подробно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication2
{
    class FailsoftDemo
    {
        int[] a;
        public int Length;
        public bool Errflag;
 
        public FailsoftDemo(int size)
        {
            a = new int[size];
            Length = size;
        }
        
        public int this[int index]
        {
            get
            {
                if (ok(index))
                {
                    Errflag = false;
                    return a[index];
                }
                else
                {
                    Errflag = true;
                    return 0;
                }
            }
            set
            {
                if (ok(index))
                {
                    a[index] = value;
                    Errflag = false;
                }
                else Errflag = true;
            }
        }
 
        private bool ok(int index)
        {
            if ((index >= 0) & index < Length) return true;
             return false;
        }
    }
    class fsdemo
    {
        static void Main()
        {
            FailsoftDemo fs = new FailsoftDemo(5);
            int x;
 
            Console.WriteLine("Скрытый сбой!");
 
            for (int i = 0; i < fs.Length*2; i++)
                fs[i] = i*10;
 
            for (int i = 0; i < fs.Length * 2; i++)
            {
                x = fs[i];
                if (x != -1) Console.Write(x + " ");
            }
            Console.WriteLine();
 
            for (int i = 0; i < fs.Length*2; i++)
            {
                fs[i] = i*10;
                if(fs.Errflag)
                    Console.WriteLine("fs["+i+"] вне границ");
 
            }
            for (int i = 0; i < fs.Length * 2; i++)
            {
                x = fs[i];
                if (!fs.Errflag) Console.Write(x + " ");
                else Console.WriteLine("fs[" + i + "] вне границ");
                
                    
                
            }
 
 
 
 
 
        }
    }
}
0
Финал
2 / 2 / 2
Регистрация: 11.09.2013
Сообщений: 70
03.04.2014, 08:28  [ТС] 3
Этот пример я прорешал, но не понял суть: вот для наглядности не много измененная программа которую я опубликовал в пером посте, теперь она выводит номер индекса:
Код
using System;
class failsoftDemo
{
    int[] a;
    int len;
    bool errflag;
    public int t;

    public failsoftDemo(int size)
    {
        a = new int[size];
        len = size;
    }
    public int Lenght
    {
        get
        {
            return len;
        }
        set
        {
            len = value;
        }
    }
    public bool Error
    {
        get
        {
            return errflag;
        }
    }
    public int this[int index]
    {
        get
        {
            if (ok(index))
            {
                errflag = false;
                t = index;
                return a[index];
            }
            else
            {
                errflag = true;
                t = index;
                return 0;
            }
        }
        set
        {
            if (ok(index))
            {
                a[index] = value;
                t = index;
                errflag = false;
            }
            errflag = true;
            t = index;
        }
    }

    private bool ok(int index)
    {
        if ((index >= 0) & (index < Lenght)) return true;
        else return false;
    }
}
class fsdemo
{
    static void Main()
    {
        failsoftDemo fs = new failsoftDemo(5);
        int x;
        
        Console.WriteLine();


        

        for (int i = 0; i < fs.Lenght * 2; i++)
        {

            fs[i] = i;
            Console.WriteLine(fs.t);
            if (fs.Error) Console.WriteLine("fs["+i+"]-ошибки");
            else Console.WriteLine("fs[" + i + "]");
            
        }


        Console.ReadKey();
    }
}
Результатом выполнения будет следущее:

0
fs[0]-ошибки
1
fs[1]-ошибки
2
fs[2]-ошибки
3
fs[3]-ошибки
4
fs[4]-ошибки
5
fs[5]-ошибки
6
fs[6]-ошибки
7
fs[7]-ошибки
8
fs[8]-ошибки
9
fs[9]-ошибки

Дак почему же флаги не срабатывают если явно видно что индекс превысил размер массива???
0
kodv
1419 / 1093 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
03.04.2014, 08:48 4
Лучший ответ Сообщение было отмечено Финал как решение

Решение

Цитата Сообщение от Финал Посмотреть сообщение
Ребят обьясните нубу как работа.т эти индексаторы не могу двигаться дальше
У вас здесь проблема не в индексаторах. Будем считать, что вы их поняли правильно. Ошибка здесь:
C#
1
2
3
4
5
6
7
8
9
set
        {
            if (ok(index)) // Если все ОК, то выполняем код ветвления
            {
                a[index] = value; // Задаем index'ому элементу массива значение value
                errflag = false; // Сбрасываем флаг ошибки
            }
            errflag = true; // А ЗДЕСЬ ВЫ ЭТОТ ФЛАГ ОШИБКИ ВЫСТАВЛЯЕТЕ В НЕЗАВИСИМОСТИ ОТ ТОГО, ЕСТЬ ОНА ИЛИ НЕТ
        }
То есть, при любом присваивание значения вашему объекту через индексатор у вас будет выставлен флаг ошибки, что вы и видите в своем окне.
1
Финал
2 / 2 / 2
Регистрация: 11.09.2013
Сообщений: 70
03.04.2014, 08:55  [ТС] 5
Ай точно же!!else не написал. Спасибо большое! Вы мне здорово помогли!
0
03.04.2014, 08:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2014, 08:55

Индексаторы и свойства
Немного не могу понять для чего нужны индексаторы и свойства. Необходимо...

Классы и индексаторы
Помогите с лабораторной c#, пожалуйста... Общая постановка задачи Класс А...

Индексаторы и перегрузка
Напишите, пожалуйста, как использовать перегрузки из класса в основной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru