
- •Введение
- •Создание простого приложения в ms Visual Studio
- •Отладка программы
- •Пошаговый режим
- •Точки останова
- •Безусловные точки останова
- •Условные точки останова
- •Просмотр переменных
- •Стек вызова функций
- •Разработка оконных приложений
- •Размещение компонентов на форме. Свойства компонента.
- •Компонент CheckBoxListBox
- •Переменные
- •Приведение типов
- •Операции, приоритет
- •Перегрузка операций
- •If(выражение_1) оператор_1
- •Циклы While
- •Цикл foreach
- •Программирование классов
- •Введение в классы и объекты в с#
- •Общий синтаксис класса
- •Поля и свойства
- •Использование переменного числа аргументов
- •Объявление объектов класса. Оператор new
- •Инциализация членов класса
- •Конструкторы и деструкторы
- •Ключевое слово this
- •Ключевое слово static
- •Наследование
- •Полиморфизм.
- •Абстрактные классы
- •Интерфейсы
- •Реализация интерфейсов
- •Интерфейсные свойства
- •Интерфейсные индексаторы
- •Массивы
- •Обработка исключительных ситуаций
- •Предварительная проверка параметров
- •Проверка кодов возврата функций и методов
- •Применение механизма исключений
- •Блоки try-catch
- •Применение блока finally
- •Массивы как коллекции
- •Коллекция ArrayList
Применение блока 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 до 28(или больше);
дома на улице могут иметь номера до тысячи;
этажи здания нумеруются от 1 и до 100;
участники спортивных соревнований получают номера;
Рассмотрим пример с участниками марафона, которых надо учесть, но общее количество соревнующихся заранее неизвестно.
Сначала создадим класс 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 байт. Затем для считывания элемента массива вычисляется его положение в памяти на основании номера элемента и размера элементов и затем считывается нужный участок памяти. С коллекциями всё иначе. Каждый элемент коллекции представлен не одной переменной, содержащей его значение, а структурой данных. Она содержит указатель на данные элемента, ссылки на предыдущий и следующий элемент коллекции. Естественно, такая структура будет занимать больше пространства в оперативной памяти, чем одна единственная переменная. Доступ к данным в коллекции также организуется по-особому. Для получения, например, пятого элемента, коллекция перебирает все элементы, начиная с первого, пока не дойдёт до нужного индекса