
- •Лекция 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. Классы прототипы, параметризованные коллекции
- •Создание класса-прототипа
- •//При использовании класса-прототипа вместо параметра т подставляется //конкретный тип данных
- •Ограничения
- •Обобщенные методы
- •Преимущества использования параметризованных классов и методов:
Виды файлов
Информация, обрабатываемая фалами в С# может быть в виде:
двоичного представления данных(классы BinaryReader, BinaryWriter);
байтов (FileStream);
текста, то есть символов (StreamWriter, StreamReader).
Двоичные и байтовые потоки хранят данные в том же виде, в котором они представлены в оперативной памяти, то есть при обмене с файлом происходит побитовое копирование информации. Двоичные файлы применяются не для просмотра их человеком, а для использования в программах.
Соответственно, различают текстовые, двоичные и байтовые файлы.
Доступк файлам может бытьпоследовательным,когда очередной элемент можно прочитать (записать) только после аналогичной операции с предыдущим элементом, ипроизвольным (прямым),при котором выполняется чтение (запись) произвольного элемента по заданному адресу.
Текстовые файлы позволяют выполнять только последовательный доступ, в двоичных и байтовых потоках можно использоватьоба метода.
Методы форматированного ввода (ЧТЕНИЯ)значений арифметических типов, в С# не поддерживаются. Для преобразования из символьного в числовое представление используются методы классаConvertили методParse.
Форматированный вывод (ЗАПИСЬ)выполняется с помощью методаToString, результаты выполнения которых передаются в методы текстовых файлов.
Алгоритм работы с файловыми потоками
Использование классов файловых потоков в программе предполагает следующие операции:
Создание потока и связывание его с физическим файлом.
Обмен информацией (чтение-запись).
Закрытие файла.
Каждый файл можно создавать разными способами и открывать в различных режимах (файлы можно открывать для чтения, только для записи или для чтения и записи).
Режимы доступа к файлу содержаться в переменной FileAccess, определенном в пространстве имен System.IO. Константы перечисления приведены в таблице 11.2.
Таблица 11.2- Значения FileAccess
Значение Описание
ReadОткрыть файл только для чтения
ReadWriteОткрыть файл для чтения и записи
WriteОткрыть файл для записи
Возможные режимы открытия файлаопределены в переменнойFileMode(таблица 11.3)
Таблица 11.3 - Значения FileMode
Значение Описание
AppendОткрыть файл, если он существует, и установить текущий
указатель в конец файла. Если файл не существует, создать
новый файл
CreateСоздать новый файл. Если в каталоге уже существует файл с
таким же именем, он будет стерт
CreateNewСоздать новый файл. Если в каталоге уже существует файл с
таким же именем, возникает исключение IOException
OpenОткрыть существующий файл
OpenOrCreateОткрыть файл, если он существует. Если нет создать файл с
таким именем
TruncateОткрыть существующий файл. После открытия он должен быть
обрезан до нулевой длины
Режим FileMode.Appendможно использовать только совместно с доступом типаFileAccess.Write, то есть для файлов, открываемых для записи.
Байтовые файлы (потоки)
Ввод-вывод в файл на уровне байтов выполняется с помощью класса FileStream,основные элементы которого представлены в таблице 11.4.
Таблица 11.4 - Элементы класса Stream
Элемент Описание
BeginRead, Начать асинхронный ввод или вывод
BeginWrite
CanRead, Свойства, определяющие, какие операции поддерживает поток: чтение,
CanSeek, прямой доступ и/или запись
CanWrite
CloseЗакрыть текущий поток и освободить связанные с ним ресурсы (сокеты,
указатели на файлы)
EndRead, Ожидать завершения асинхронного ввода; закончить асинхронный вывод
EndWrite
FlushЗаписать данные из буфера в связанный с потоком источник данных
и очистить буфер. Если для данного потока буфер не используется,
то этот метод ничего не делает
LengthВозвратить длину потока в байтах
PositionВозвратить текущую позицию в потоке
Read, Считать последовательность байтов (или один байт) из текущего потока
ReadByteи переместить указатель в потоке на количество считанных байтов
SeekУстановить текущий указатель потока на заданную позицию
SetLengthУстановить длину текущего потока
Write, Записать последовательность байтов (или один байт) в текущий поток
WriteByteи переместить указатель в потоке на количество записанных байтов
Байтовый поток класс FileStreamреализует эти элементы для работы с дисковыми файлами. Для определения режимов работы с файлом используются стандартные перечисленияFileMode,FileAccess.
Пример работы с байтовым файлом
//Демонстрация чтения и записи одного байта и массива байтов, а также //позиционирование в потоке.
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
//создание файловой переменной и связывание с байтовым потоком - //файлом на диске с именем est.txt
// файл создается для чтения и записи
FileStream f=new FileStream("est.txt",
FileMode.Create, FileAccess.ReadWrite );
f.WriteByte( 100 ); //в начало файла записывается число 100
byte[] x=new byte[10];
for ( byte i=0; i<10; ++i)
{
x[i]=(byte)(10-i);
f.WriteByte(i); // записывается 10 чисел от 0 до 9
}
f.Write( x, 0, 5 ); //записывается 5 элементов массива
byte[] y=new byte[20];
f.Seek( 0, SeekOrigin.Begin ); //текущий указатель – на начало
f.Read( y, 0, 20 ); //чтение из файла в массив
foreach ( byte elem in y ) Console.Write( " " + elem );
Console.WriteLine();
f.Seek(5, SeekOrigin.Begin); //текущий указатель – на 5-ый элемент
int a = f.ReadByte(); //чтение 5-го элемента
Console.WriteLine( a );
a = f.ReadByte(); //чтение 6-го элемента
Console.WriteLine( a );
Console.WriteLine("Текущая позиция в потоке " + f.Position);
Console.ReadKey();
f.Close(); } }}
Результат работы программы: 100 0 1 2 3 4 5 6 7 8 9 10 9 8 7 6 0 0 0 0
4
5
Текущая позиция в потоке 7
Текущая позиция в потоке первоначально устанавливается на начало файла(для любого режима открытия, кромеAppend) и сдвигаетсяна одну позицию призаписи каждого байта.
Для установки желаемой позиции чтения используется метод Seek, имеющий два параметра: первый задает смещение в байтах относительно точки отсчета, задаваемой вторым. Точки отсчета задаются константами перечисленияSeekOrigin: начало файла –Begin, текущая позиция –Currentи конец файла –End.
В данном примере файл создавался в текущем каталоге. Можно указать и полный путь к файлу, при этом удобнее использовать дословные литералы, например
FileStream f=new FileStream (@”D:\C#\test.txt”, FileMode.Create, FileAccess.ReadWrite);
В дословных литералах не требуется дублировать обратную косую черту.