
- •Лекция 1. Введение. Платформа .Net. Среда Visual Studio.Net. Консольные приложения
- •Платформа .Net
- •Среда Visual Studio.Net
- •Консольные приложения
- •Заготовка консольной программы
- •Вопросы для самоконтроля
- •Лекция 2. Основные понятия языка Алфавит и лексемы
- •Алфавит с# включает:
- •Идентификаторы
- •Ключевые слова
- •Знаки операций и разделители
- •Литералы
- •Лекция 3. Типы данных с#. Переменные, операции, выражения
- •Встроенные типы
- •Типы-значения и ссылочные типы
- •Упаковка и распаковка
- •Переменные
- •Пример описания локальных переменных
- •Именованные константы
- •Операции и выражения
- •Преобразования встроенных арифметических типов-значений
- •Явное преобразование типа
- •Основные операции с#
- •Решение дз
- •Математические функции – класс Math
- •Лекция 5. Операторы языка c#
- •Блок или составной оператор
- •Пустой оператор
- •Операторы выбора (ветвления)
- •Оператор if
- •If(выражение_1) оператор_1;
- •If(выражение1) if(выражение2) if(выражение3) ...
- •Примеры оператора if:
- •Следует избегать проверки ве5щественных величин на равенство, вместо этого лучше сравнивать модуль их разности с некоторым малым числом:
- •Оператор switch (переключатель)
- •Операторы перехода
- •Оператор goto
- •Операторы break и continue
- •Оператор return
- •Лекция 6. Операторы цикла
- •Цикл с предусловием while
- •While ( выражение ) оператор
- •Цикл с постусловием do
- •Do оператор while выражение;
- •Цикл с параметром for
- •Цикл перебора foreach
- •Рекомендации по выбору оператора цикла
- •Лекция 7. Массивы
- •Одномерные массивы
- •Прямоугольные массивы
- •Класс System.Array
- •Оператор foreach для работы с массивами
- •Примеры обработки массивов с использованием класса Array
- •Лекция 8. Строки
- •Работа с символами в с#
- •Массивы символов
- •Строки типа string
- •Операции над строками
- •Форматирование строк
- •Пользовательские шаблоны форматирования
- •Строки типа StringBuilder
- •Лекция 9. Класс Random. Функции в языке с#
- •Функции (методы) в языке с#
- •Способы обмена информацией
- •Параметры-значения
- •Параметры-ссылки
- •Выходные параметры
- •Модифицированный пример применения выходных параметров
- •Лекция 10. Указатели в языке с# Небезопасный код
- •Синтаксис указателей
- •Указатель void
- •Преобразование указателей
- •Инициализация указателей
- •Арифметические операции с указателями
- •Приоритетность выполнений операций с указателями
- •Указатель на указатель
- •Операция stackalloc
- •Лекция 11. Файлы в с# Основные понятия. Классы .Net для работы с файлами
- •Виды файлов
- •Алгоритм работы с файловыми потоками
- •Байтовые файлы (потоки)
- •Обработка исключительных ситуаций при работе с файлами
- •Текстовые файлы
- •Пример преобразования чисел, содержащихся в текстовом файле
- •Консольный ввод-вывод
- •Работа с каталогами и файлами
- •Лекция 12. Структуры и перечисления в языке с#
- •Перечисления
- •Операции с перечислениями
- •Базовый класс System.Enum
- •Рекомендации по программированию
- •Пример программы с использованием структур с методами и перечислений
- •Лекция 13. Основные понятия ооп. Классы.
- •Данные: поля и константы
- •Виды элементов класса
- •Лекция 13_часть 2. Ооп. Члены класса. Основные свойства ооп
- •Члены класса
- •Свойства и поля
- •Конструкторы
- •Деструкторы
- •Статические члены класса и члены класса экземпляра
- •Интерфейсы
- •Основные свойства ооп
- •3. Полиморфизм
- •Упражнения к лекции
- •Решение дз
- •Лекция 14. Конструкторы. Параметр this. Ключевое слово this
- •Конструкторы
- •Конструкторы класса (статические конструкторы)
- •Класс “ Monster”
- •Свойства класса
- •Рекомендации по программированию
- •Лекция 15. Наследование. Виртуальные функции. Сокрытие методов базового класса. Абстрактные и закрытые классы Наследование
- •Особенности поведения конструкторов при наследовании
- •Пример программы иерархии наследования с использованием конструкторов
- •Синтаксис объявления наследования
- •Виртуальные методы
- •Правила использования виртуальных методов
- •Сокрытие методов базового класса
- •Вызов переопределенных или скрытых методов базового класса
- •Абстрактные классы и функции
- •Правила работы с абстрактными классами и методами:
- •Пример использования абстрактного класса
- •Закрытые (изолированные) классы и методы
- •Лекция 16. Интерфейсы. Использованием интерфейсов
- •Пример описания, реализации и использования интерфейса
- •Void Draw(); //простой метод вывода имени монстра
- •Int Attack(int a); //реализация атаки с заданной силой
- •Void Die(); // метод вывода на экран сообщения о смерти монстра
- •Int Power { get; } //свойство, вычисляющее силу монстра
- •Лекция 17. Семейства. Индексаторы
- •Пример использования семейства System.Collections.ArrayList
- •Определение собственных семейств
- •Индексаторы
- •Пример с использованием собственного семейства
- •Семейства с доступом по ключу и интерфейс iDictionary
- •Индексаторы и пользовательские классы
- •Лекция 18. Перегрузка методов и операций в классах Перегрузка методов
- •Перегрузка операций
- •Перегрузка унарных операций
- •Пример перегрузки унарных операций на примере класса
- •Перегрузка бинарных операций
- •Public static тип_возвр_знач operator бинарная_операция (параметр1, параметр2),
- •Пример перегрузки бинарных операций на примере класса
- •Класс System.Object
- •Пример перегрузки операций сравнения с использованием стандартных методов класса Object
- •Лекция 19. Стандартные интерфейсы. Клонирование. Итераторы Стандартные интерфейсы .Net
- •Сравнение объектов (интерфейс iComparable)
- •Пример использования стандартного интерфейса iComparable на примере класса Monster
- •Сортировка объектов по различным критериям (интерфейс iComparer)
- •Пример использования стандартного интерфейса iComparer на примере класса Monster
- •Клонирование объектов (интерфейс iCloneable)
- •Перебор элементов (интерфейс iEnumerable) и итераторы
- •Пример работы класса с итератором
- •Примеры применения простейших итераторов
- •Лекция 20, 21. Делегаты и события
- •Пример делегата для обычной функции
- •Пример делегата для метода класса
- •1.Делегат для выбора методов на этапе выполнения
- •Delegate.Invoke или что там внутри? (для продвинутых)
- •Пример делегата для работы с несколькими методами
- •2. Делегат как оповещатель. Паттерн «наблюдатель»
- •Пример делегата для оповещения наблюдателей
- •3. Делегат как процедура обратного вызова
- •Пример передачи делегата в качестве параметра функции
- •4.Делегат, как обработчик событий
- •[Cпецификаторы] event тип делегата имя события, где
- •Пример делегата для оповещения наблюдателей с помощью событий
- •Стандартные делегаты
- •Пример стандартного делегата EventHandler для оповещения наблюдателей с помощью событий
- •Лекция 21. Сборки, библиотеки, атрибуты, директивы. Сборка
- •Создание собственной библиотеки
- •Пример создания и использования собственной библиотеки
- •Рефлексия
- •Пример применения рефлексии
- •Атрибуты
- •Пространство имён
- •Директивы препроцессора
- •Пример использования директив препроцессора
- •Лекция 22. Классы прототипы, параметризованные коллекции
- •Создание класса-прототипа
- •//При использовании класса-прототипа вместо параметра т подставляется //конкретный тип данных
- •Ограничения
- •Обобщенные методы
- •Преимущества использования параметризованных классов и методов:
Обработка исключительных ситуаций при работе с файлами
Операции по открытию файлов могут завершиться неудачно, например, при ошибке в имени существующего файла или отсутствии свободного места на диске, поэтому рекомендуется всегда контролировать результаты этих операций. В случае непредвиденных ситуаций среда выполнения генерирует различные исключения, обработку которых следует предусмотреть в программе, например:
FileNotFoundException, если файла с указанным именем в указанном каталоге не существует;
DirectoryNotFoundException, если не существует указанный каталог;
ArgumentEception, если неверно задан режим открытия файла;
IOException, если файл не открывается из-за ошибок ввода-вывода.
Удобно обрабатывать наиболее вероятные ошибки раздельно, чтобы предоставить пользователю программы в выводимом сообщении наиболее точную информацию. В приведенном далее примере отдельно перехватывается ошибка в имени файла, а затем обрабатывается все остальные возможные ошибки:
try
{
FileStream f=new FileStream( @"d:\C#\text.txt",
FileMode.Open, FileAccess.Read);
... //действия над файлом
f.Close();
}
catch(FileNotFoundException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Проверьте правильность имени файла! ");
return;
}
catch(Exception e)
{
Console.WriteLine("Error: " + e.Message);
return; }
При закрытии файла освобождаются все связанные с ним ресурсы, например, для файла, открытого для записи, в файл выгружается содержимое буфера. Поэтому рекомендуется всегда закрывать файлы после окончания работы, в особенности файлы, открытые для записи.
Текстовые файлы
Символьные потоки - классы StreamWriterиStreamReaderработают сUnicode-символами, следовательно, ими удобнее всего пользоваться для работы с файлами, предназначенными для восприятия человеком. Эти потоки являются наследниками классовTextWriterиTextReaderсоответственно. В таблицах 11.5 и 11.6 приведены основные элементы этих классов.Произвольный доступдля текстовых файловне поддерживается.
Таблица 11.5 – Основные элементы класса TextWriter
Элемент Описание
CloseЗакрыть файл и освободить связанные с ним ресурсы. Если в процессе
записи используется буфер, он будет очищен
FlushОчистить все буферы для текущего файла и записать накопленные
в них данные в место их постоянного хранения. Сам файл при этом
не закрывается
NewLineИспользуется для задания последовательности символов, означающих
начало новой строки. По умолчанию используется последовательность
«возврат каретки» - «перевод строки» (\r\n)
WriteЗаписать фрагмент текста в поток
WriteLineЗаписать строку в поток и перейти на другую строку
Таблица 11.6 - Основные элементы класса TextReader
Элемент Описание
PeekВозвратить следующий символ, не изменяя позицию указателя в файле
ReadСчитать данные из входного потока
ReadBlockСчитать из входного потока указанное пользователем количество
символов и записать их в буфер, начиная с заданной позиции
ReadLineСчитать строку из текущего потока и возвратить ее как значение
типа string. Пустая строка (null) означает конец файла(EOF)
ReadToEndСчитать все символы до конца потока, начиная с текущей позиции,
и возвратить считанные данные как одну строку типа string
Примеры записи и чтения текстового файла
В данном примере создается текстовый файл, в который записываются 2 строки. Вторая формируется из преобразования численных значений переменных и поясняющего текста. Содержимое файла можно посмотреть в любом текстовом редакторе. Файл создается в том же каталоге, куда среда записывает исполняемый файл. По умолчанию это каталог …\ConsoleApplication1\bin\Debug.
//ЗАПИСЬ В ТЕКСТОВЫЙ ФАЙЛ
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{ try
{ StreamWriter f=new StreamWriter("text.txt");
f.WriteLine("Запись в текстовый файл:");
double a =12/234;
int b=29;
f.WriteLine("a={0,6:C} b={1,2:X}", a, b);
f.Close();
}
catch (Exception e)
{ Console.WriteLine("Error:" +e.Message);
Console.ReadKey();
return; } } }}
Файл, созданный в предыдущем примере выводиться на экран.
//ЧТЕНИЕ ТЕКСТОВОГО ФАЙЛА
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{ try
{ StreamReader f=new StreamReader ("text.txt");
string s=f.ReadToEnd();
Console.WriteLine(s);
f.Close();
}
catch (FileNotFoundException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Проверьте правильность имени файла!");
Console.ReadKey();
return; }
catch (Exception e)
{
Console.WriteLine("Error:" + e.Message);
Console.ReadKey();
return; } } }}
В этой программе весь файл считывается за один приемс помощью методаReadToEnd. Чаще возникает необходимость считывать файл построчно.
Такой пример приведен ниже. Каждая строка при выводе представляется номером.
//Построчное чтение текстового периода
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{ try
{ StreamReader f=new StreamReader ("text.txt");
string s;
long i=0;
while((s=f.ReadLine()) != null)
Console.WriteLine("{0}: {1}", ++i, s);
f.Close();
}
catch (FileNotFoundException e)
{ Console.WriteLine(e.Message);
Console.WriteLine("Проверьте правильность имени файла!");
Console.ReadKey();
return; }
catch (Exception e)
{ Console.WriteLine("Error:" + e.Message);
Console.ReadKey(); return; } } }}