Одномерные индексаторы. По примеру из книги Шилдта - разобрать код - C#
Формулировка задачи:
Не могу понять смысл приведённого в книге примера. Это программа, в которой создается класс FailSoftArray, реализующий массив для выявления ошибок нарушения границ массива. По задаче много вопросов, для удобства они написаны в качестве комментариев к коду.
P.S Везде написано, что индексаторы расширяют возможности класса, более удобные и т.п. Я даже не то чтобы не понимаю, как некоторые части кода реализованы, а для чего вообще этот пример нужен в практическом применении.
Очень надеюсь на вашу помощь. Вроде бы тема не сложная, но меня поставила в тупик.
Листинг программы
- // Использовать индексатор для создания отказоустойчивого массива.
- using System;
- class FailSoftArray {
- int[] a; // ссылка на базовый массив
- public int Length; // открытая переменная длины массива
- public bool ErrFlag; // обозначает результат последней операции
- // Построить массив заданного размера.
- public FailSoftArray(int size) {
- a = new int[size];
- Length = size;
- }
- // Это индексатор для класса FailSoftArray.
- public int this[int index] { // Откуда передаётся этот параметр index?
- // Это аксессор get.
- Get {
- if(ok(index)) {
- ErrFlag = false;
- } else {
- ErrFlag = true;
- return 0;
- }
- }
- // Это аксессор set.
- set {
- if(ok(index)) {
- a[index] = value; //В комментариях книги написано: «Если параметр index метода ok() находится в установленных
- //пределах, то соответствующему элементу массива присваивается значение, передаваемое из параметра value». Не
- //могу понять, а какое значение принимает параметр Value, чтобы он его передал элементу массива в данном случае?
- ErrFlag = false;
- }
- else ErrFlag = true;
- }
- }
- // Возвратить логическое значение true, если
- // индекс находится в установленных границах.
- private bool ok(int index) {
- if(index >= 0 & index < Length) return true;
- return false;
- }
- }
- // Продемонстрировать применение отказоустойчивого массива.
- class FSDemo {
- static void Main() {
- FailSoftArray fs = new FailSoftArray(5);
- int x;
- // Выявить скрытые сбои.
- Console.WriteLine("Скрытый сбой."); //Что вообще здесь понимается под скрытым сбоем?
- for(int i=0; i < (fs.Length * 2); i++) //Почему в условии ставим именно (fs.Length * 2)?
- fs[i] = i*10;
- for(int i=0; i < (fs.Length * 2); i++) { //Какой вообще смысл создавать 2 цикл?
- //Ведь можно было в первом всё сделать. Зачем присваивать значение fs[i] переменной х, почему бы не использовать сам fs[i]?
- x = fs[i];
- if(x != -1) Console.Write(x + " "); // Как оно может быть равно -1, если мы сами ставили условие в цикле, что i равно от 0 до (fs.Length * 2), а fs[i] = i*10?
- }
- Console.WriteLine();
- // А теперь показать сбои.
- Console.WriteLine("\nСбой с уведомлением об ошибках.");
- 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 + "] вне границ");
- }
- }
- }
Решение задачи: «Одномерные индексаторы. По примеру из книги Шилдта - разобрать код»
textual
Листинг программы
- return a[index];
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д