Int upperBound; // наибольший индекс



 

Автоматически реализуемое и доступное

Только для чтения свойство Length,

public int Length { get; private set; }

 

Построить массив по заданному размеру

public RangeArray(int low, int high) {

high++;

if(high <= low) {

throw new RangeArrayException("Нижний индекс не меньше верхнего.");

}

a = new int[high - low];

Length = high - low;

lowerBound = low;

upperBound = --high;

}

 

Это индексатор для класса RangeArray.

public int this[int index] {

// Это аксессор get.  

get {

if(ok(index)) {

return a[index - lowerBound];

} else {

throw new RangeArrayException("Ошибка нарушения границ.");

}

}

Это аксессор set.

set {

if(ok(index)) {

a[index - lowerBound] = value;

}

else throw new RangeArrayException("Ошибка нарушения границ.");

}

}

// Возвратить логическое значение true, если  

Индекс находится в установленных границах,

private bool ok(int index) {

if(index >= lowerBound & index <= upperBound) return true;

return false;

}

}

 

// Продемонстрировать применение массива с произвольно

// задаваемыми пределами индексирования,

class RangeArrayDemo {

static void Main() {

try {

RangeArray ra = new RangeArray(-5, 5);

RangeArray ra2 = new RangeArray(1, 10);

 

Использовать объект га в качестве массива.

Console.WriteLine("Длина массива rа: " + ra.Length);

for(int i = -5; i <= 5; i++) ra[i] = i;

 

Console.Write("Содержимое массива ra: ");

for (int i = -5; i <= 5; i++)

Console.Write(ra[i] + " ");

 

Console.WriteLine("\n");

 

Использовать объект ra2 в качестве массива.

Console.WriteLine("Длина массива rа2: " + ra2.Length);

for (int i = 1; i <= 10; i++) ra2[i] = i;

 

Console.Write("Длина массива ra2: ");

for (int i = 1; i <= 10; i++)

Console.Write(ra2[i] + " ");

 

Console.WriteLine("\n") ;

}  

catch (RangeArrayException exc) {

Console.WriteLine(exc);

}

 

А теперь продемонстрировать обработку некоторых ошибок.

Console.WriteLine("Сгенерировать ошибки нарушения границ.");

Использовать неверно заданный конструктор,

try {

RangeArray ra3 = new RangeArray(100, -10); // Ошибка!

}

catch (RangeArrayException exc) {

Console.WriteLine(exc);

}

 

Использовать неверно заданный индекс,

try {

RangeArray ra3 = new RangeArray(-2, 2);

for(int i = -2; i <= 2; i++) ra3[i] = i;

 

Console.Write("Содержимое массива ra3: ");

for (int i = -2; i <= 10; i++) // сгенерировать ошибку нарушения границ

Console.Write(ra3[i] + " ");

}

catch (RangeArrayException exc) {

Console.WriteLine(exc);

}

}

}

 

После выполнения этой программы получается следующий результат.

 

Длина массива rа: 11

Содержимое массива ra: -5 -4 -3 -2 -1 0 1 2 3 4 5  

 

Длина массива ra2: 10

Содержимое массива ra2: 1 2 3 4 5 6 7 8 9 10

 

Сгенерировать ошибки нарушения границ.

Нижний индекс не меньше верхнего.

Содержимое массива raЗ: -2 -1 0 1 2 Ошибка нарушения границ.

 

Когда возникает ошибка нарушения границ массива класса RangeArray, генерируется объект типа RangeArrayException. В классе RangeArray это может произойти в трех следующих местах: в аксессоре get индексатора, в аксессоре set индексатора и в конструкторе класса RangeArray. Для перехвата этих исключений подразумевается, что объекты типа RangeArray должны быть сконструированы и доступны из блока try, что и продемонстрировано в приведенной выше программе. Используя специальное исключение для сообщения об ошибках, класс RangeArray теперь действует как один из встроенных в C# типов данных, и поэтому он может быть полностью интегрирован в механизм обработки ошибок, обнаруживаемых в программе.

Обратите внимание на то, что в теле конструкторов класса исключения RangeArrayException отсутствуют какие-либо операторы, но вместо этого они просто передают свои аргументы классу Exception, используя ключевое слово base. Как пояснялось ранее, в тех случаях, когда производный класс исключений не дополняет функции базового класса, весь процесс создания исключений можно поручить конструкторам класса Exception. Ведь производный класс исключений совсем не обязательно должен чем-то дополнять функции, наследуемые от класса Exception.

Прежде чем переходить к дальнейшему чтению, попробуйте немного поэкспериментировать с приведенной выше программой. В частности, попробуйте закомментировать переопределение метода ToString() и понаблюдайте за результатами. Кроме того, попытайтесь создать исключение, используя конструктор, вызываемый по умолчанию, и посмотрите, какое сообщение при этом сформируется стандартными средствами С#.

 

 


Дата добавления: 2019-02-12; просмотров: 279; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!