Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование C_Sharp.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.5 Mб
Скачать

Применение блока finally

В некоторых случаях при обработке исключений с применением блоков try и catch имеет смысл дополнительно предусмотреть блок finally. Этот блок выполняется всегда, вне зависимости от того, произошло ли исключение в процессе работы блока try или нет.

Наилучшее применение для блока finally— освобождение ресурсов, заказан­ных программой перед возникновением исключений. Хотя система сборки мусора автоматически освобождает ненужную более оперативную память, другие ресурсы, та­кие, как, например, открытые потоки, связанные с файлами, следует закрывать явным образом, вызывая соответствующие методы.

Рассмотрим пример использования блока finally.

using System;

namespace Finally

class FinallyApp

namespase Finally

class FinallyApp

{

static void openFile(string path)

{

Console. WriteLine( "Открытке файла" );

}

static void closeFile()

{

Console.WriteLine(“Закрытие файйла”);

}

static void writeFile(string data)

{

Console.WriteLine(“запись в файл строки {0}”, data);

int x = 0;

int y = 5 / x;

}

static void Main(string[] args)

{

FinallyApp.openFile(“numbers.txt”);

}

try

{

FinallyApp.writeFilef"test");

}

catch(Exception ex)

{

Console.WriteLine(">>>>> Исключение: {0} ", ex.Message);

}

finally

{

FinallyApp.closeFile();

}

Console.ReadLine();

}

}

}

Массивы как коллекции

Коллекции – это специальный вид классов, предназначенных для хранения и управления многими объектами.

На практике довольно часто возникают случаи, когда объект задается многократно. В подобных случаях довольно удобна нумеровка подобных объектов. Например:

  1. дни месяца нумеруются от 1 до 28(или больше);

  2. дома на улице могут иметь номера до тысячи;

  3. этажи здания нумеруются от 1 и до 100;

  4. участники спортивных соревнований получают номера;

Рассмотрим пример с участниками марафона, которых надо учесть, но общее количество соревнующихся заранее неизвестно.

Сначала создадим класс contestants[участники] со всеми необходимыми полями и методами. Далее объявляем массив следующим образом:

contestants[] contestant;

Теперь мы можем создать экземпляр класса следующим образом:

contestant = new contestants[n];

где n – вероятный предел количества участников.

При каждом увеличении числа соревнующихся на 1, создается новый объект для соответствующего элемента массива и увеличиваем счетчик числа элементов:

Contestant[k] = new contestants(name, number, bestTime);

k++;

У данного метода есть недостаток – при превышении числа соревнующихся числа n программа выдаст ошибку, присущую всем простым массивам.

Коллекция ArrayList

Проблема статического создания массива решается при помощи использования другого класа данных языка С#. В пространстве имен System.Collections имеется встроенный класс с названием ArrayList. Если мы объявляем объект этого класса, мы получаем массив, который в большинстве отношений функционирует как простой массив, но может расти, если его начальный или текущий размер оказывается недостаточным. Поэтому можно объявить:

Using System.Collections;

ArrayList constant = new constants(100);

и если число объектов превысит 100, это не будет иметь никакого значе­ния. Массив будет расширен системой насколько нужно и как только в этом возникнет необходимость. Число, указываемое в предложении, которое со­здает начальный список, является лишь оценкой ожидаемого размера массива.

В таблице 1 приведены свойства и методы класса ArrayList.

Таблица 1 – свойства и методы класса ArrayList

int count

возвращает число занятых элементов в списке

int BinarySearch(v)

просматривают список в поисках значения v, ища любое вхождение, требует упорядоченного массива

bool Contains(v)

просматривают список в поисках значения v,ища любое вхождение, возвращает true или false

void Clear(first, num)

удаляет из списка все элементы

int IndexOf(v)

просматривают список в поисках значения v, ища первое вхождение

int LastIndexOf(v)

просматривают список в поисках значения v, ища последнее вхождение

void removeAt(i)

удаляет элемент с индексом /.

void Sort()

упорядочивает массив а, так что его элементы выстраиваются в

возрастающем порядке.

void Array ToArray(type)

копирует элементы в массив данного типа

К сожалению, ArrayList также имеет свои недостатки. По сравнению с массивами коллекции ArrayList работают гораздо медленнее и занимают больше оперативной памяти. Происходит это из-за особенностей коллекций, которые, собственно, и создают удобство их использование (возможность добавлять и удалять элементы из середины коллекции). Если вы создаёте массив, то его размер будет равен количеству элементов массива помноженному на размер каждого элемента. Например, для массива с 10 элементами типа Integer выделяется 10*4=40 байт. Затем для считывания элемента массива вычисляется его положение в памяти на основании номера элемента и размера элементов и затем считывается нужный участок памяти. С коллекциями всё иначе. Каждый элемент коллекции представлен не одной переменной, содержащей его значение, а структурой данных. Она содержит указатель на данные элемента, ссылки на предыдущий и следующий элемент коллекции. Естественно, такая структура будет занимать больше пространства в оперативной памяти, чем одна единственная переменная. Доступ к данным в коллекции также организуется по-особому. Для получения, например, пятого элемента, коллекция перебирает все элементы, начиная с первого, пока не дойдёт до нужного индекса