Одномерные индексаторы. По примеру из книги Шилдта - разобрать код - 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];