Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 09 2016 20:21:41
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

Программирование на C#. Разделяемые ресурсы


[Назад] [Следующая страница]

5.6. Работа с ресурсами, требующими явного освобождения

В заключительной части раздела про интерфейсы я уже упоминал оператор using, который позволяет заменить громоздкую конструкцию try-catch-finally при работе с ресурсам, которые требуют своего освобождения сразу же по завершении работы с ними. Конструкция using гарантирует, что ресурс будет освобожден даже если в процессе работы с ним возникла исключительная ситуация. Ниже приведен код, демонстрирующий использование обеих конструкций. Предположим, имеется текстовый файл, в котором в определенном формате хранятся последовательности точек (X,Y), разделенных символом "|".

Текстовое представление координат
Список координат.

Допустим, каждая строка - это координаты ломаной линии, и нам необходимо произвести первичную обработку данных файла - сформировать в памяти список списков этих точек (в текстовом виде). Пример несложный и сопровожден подробными комментариями:

using System;
using System.IO;
using System.Collections.Generic;
using System.Windows.Forms;

namespace CSharpQuickGuide
{
    public static class UsingSample
    {
        public static void Parse(string _Filename)
        {
            //Последовательности точек в каждой строке будем сохранять в отдельном списке
            List<List<string>> _pointsList = new List<List<string>>();
            try
            {
                //Блок using гарантирует корректное освобождение ресурса StreamReader
                //после завершения чтения файла, а именно, в конце обработки "за кадром" 
                //будет вызван метод Dispose(): ((IDisposable)_reader).Dispose();
                using (StreamReader _reader = new StreamReader(_Filename))
                {
                    string _points = string.Empty;
                    //Читаем строки и сразу проверяем результат чтения
                    while ((_points = _reader.ReadLine()) != null)
                        //Разбираем очередную строку и добавляем в список
                        //новую последовательность точек
                        _pointsList.Add(ParsePoints(_points));  
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);  
            }
            //Дальнейшая обработка...
        }

        //Разбор строки с последовательностью точек
        private static List<string> ParsePoints(string _points)
        {
            List<string> _pointList = new List<String>();

            foreach (string _point in _points.Split('|'))
                _pointList.Add(_point);

            return _pointList; 
        }
    }
}

Смысл этой иллюстрации - показать, что с такими ресурсами как файл нужно работать аккуратно. Для чтения файла используется класс StreamReader, позволяющий работать с данными файла, как с потоком символов. После чтения данных из файла доступ к нему нужно вернуть операционной системе, и именно по этой причине работа с этим классом выполняется в контексте оператора using. Файл, связанный с экземпляром класса StreamReader будет корректно закрыт, даже если в ходе чтения возникнут ошибки или непредвиденные события.

Откуда компилятор знает, что перед ним класс, инкапсулирующий в себе разделяемый ресурс, и как самостоятельно создать такой класс? Чтобы компилятор понимал, что ему делать с объектом, указанным в заголовке конструкции using после завершения выполнения основного блока, соответствующий класс должен реализовывать интерфейс IDisposable. Данный интерфейс содержит определение одного единственного метода Dispose(), в реализации которого и должен быть размещен код для освобождения задействованных программой распределенных ресурсов. Примеры определения таких классов вы без труда найдете в MSDN.



[Назад] [Следующая страница]

Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.