- •1. Жизненный цикл объекта.
- •2.Делегаты. Назначение, синтаксис объявления, использование делегата. Событийная модель.
- •3. События. Объявление события. Шаблон проектирования события в классе. Свойство для безопасной работы с событиями. Безопасный вызов события в многопоточном программировании.
- •4. Обобщенные классы. Объявление и детализация класса типами пользователя.
- •5. Обобщенные методы. Объявление и детализация методов типами пользователя.
- •6. Ограничения на параметры в обобщенных классах и функциях.
- •7. Типы, допускающие значение null
- •8. Коллекции и итераторы. Оператор yield
- •9.Потоки ввода/вывода в c#. Создание объекта потока и работа с ним. Текстовые, бинарные потоки, потоки со сжатием данных.
- •11. Исключения. Создание класса пользовательского исключения. Генерация и перехват исключения.
- •12. Рефлексия типов. Класс типа Type. Методы и свойства класса.
- •13. Сборки. Статическое и динамическое связывание сборок. Класс сборки Assembly.
- •14. Позднее связывание. Класс System.Activator. Создание экземпляра объекта путем позднего связывания. Вызов методов объекта путем позднего связывания.
- •15. Атрибуты. Назначение атрибутов. Базовый класс атрибута. Аннотирование класса атрибутами.
- •16. Расширяющие методы.
- •17. Анонимные методы. Объявление и использование.
- •18. Захват переменных анонимными методами. Цепочка вызовов.
- •20. Захват переменных в лямбда-выражениях. Рекурсивный вызов в лямбда-выражениях. Анонимная рекурсия.
- •21. Выражения и деревья выражений. Стандартные делегаты, используемые с выражениями и деревьями выражений.
- •22. Комбинирование выражений посредством класса InvocatedExpression.
- •23. Язык интегрированных запросов linq. Назначение, технические средства для реализации языка. Группы языка linq.
- •24. Linq to Objects. Вид запроса. Вызов цепочек расширяющих методов. Языковые конструкции для кодирования запроса. Отложенное и неотложенное выполнение запроса.
- •25. Конструкция from…select… Разделы конструкции. Условия. Проекция. Анонимные типы данных.
- •26. Конструкция from…group… Разделы конструкции. Условия. Ключи группировки. Получение ключа в результате-выборке.
- •28. Linq to Objects. Расширяющие методы для преобразования типов, операций со множествами, преобразования в один элемент.
- •29. Технология linq to sql. Назначение технологии. Класс контекста данных и основные атрибуты для создания контекста данных.
- •30. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
9.Потоки ввода/вывода в c#. Создание объекта потока и работа с ним. Текстовые, бинарные потоки, потоки со сжатием данных.
// Пояснение: String[Reader/ Writer] = StringReader и StringWriter
Поток (stream) — абстрактный объект, который производит или потребляет информацию (хранит данные в линейной манере и так же обеспечивает доступ к ним: по одному байту за раз.)
Существуют потоки: Выходные - используются, когда данные пишутся в некоторое внешнее место назначения, например физический дисковый файл, местоположение в сети, принтер или другая программа. Входные - используются для чтения данных в память или переменные, к которым может обращаться ваша программа. Также потоки бывают двоичные и текстовые, односторонние и двусторонние.
Для чтения/записи с пульта используются методы класса Console.
Пространство имен System.IO содержит все потоковые классы. Базовый класс Stream - от него можно породить все потоки.
Служебные классы (они статические) File и Directory предоставляют множество статических методов для манипулирования файлами и каталогами.
Методы для File: Сору() — Копирует файл из исходного местоположения в целевое; Create() —Создает файл по указанному пути; Delete() —Удалят файл; Open() —Возвращает объект FileStream, находящийся по указанному пути; Move() — Перемещает указанный файл в новое место. Методы для Directory: CreateDirectory() - Создает каталог с указанным путем Delete () Удалят указанный каталог и все файлы внутри него; GetDirectories() - Возвращает массив объектов string, представляющих имена каталогов внутри указанного каталога; GetFiles() - Возвращает массив объектов string, представляющих имена файлов, находящихся в указанном каталоге; GetFileSystemEntnes() - Возвращает массив объектов string, представляющих имена файлов и каталогов внутри указанного каталога Move () Перемещает указанный каталог в новое место.
Классы FileInfo и DirectoryInfo не являются статическим. Они позволяют узнать информацию о файле/каталоге. Эти классы полезны только при создании его экземпляров. Например: cоздание объекта: Filelnfo а = new FileInfo (@"C:\Log.txt").
BufferedStream — буферный поток.
Класс FileStream используется для создания байтового потока, прикрепленного к файлу. Его определяет несколько конструкторов, например: FileStream(string имя файла FileMode режим). имя файла — имя открываемого файла, режим — как открыть файл. Например, FileMode.Append — файл откроется только для записи (вывод добавляется в коней файла). Он поддерживает форматеры — специальные классы, которые реализуют интерфейс IFormatter.
Для чтения используются 2 метода:
ReadByte() - читает 1 байт из файла. Возращает -1, когда достигнул конца файла.
Read() - читает блок байтов.
Для записи: WriteByte().
Для работы с символьно-ориентированными потоками используют обертки вокруг бaйтового потока StreamReader(чтение) и StreamWriter(запись). Эти классы автоматически преобразуют байтовый поток в символьный и наоборот. Они являются производными от классов Text[Reader/Writer].
String[Reader/ Writer] — чтение/запись в оперативную память целыми строками.
Binary[Reader/ Writer]— обертки вокруг байтового, которые управляют чтением/записью двоичных данных.
Пространством имен System.IO.Compression— позволяет читать и писать в сжатые файлы, применяя либо сжатие GZIP, либо схему сжатия Deflate. Потоки GZipStream и DeflateStream обеспечивают автоматическое сжатие данных при записи или распаковку при чтении. Их разница в реализуемом алгоритме GZIP или Deflate.
В обоих случаях они инициализируются существующим потоком, которым в случае файлов является объект FileStream. После этого их можно использовать вместе с StreamReader и StreamWriter, как и любой другой поток. Все, что потребуется сделать в дополнение указать — будет ли поток использоваться для сжатия (сохранения файлов) или распаковки (загрузки файлов), чтобы класс знал, что делать с переданными ему данными.
10. XML-документы и сериализация объектов в XML-документ. Условия применения. Шаблон применения.
Extensible Markup Language (XML) — расширяемый язык разметки. Это способ хранения данных в простом текстовом формате, т.е. он может быть прочитан почти на любом компьютере. Документом XML может быть физический файл на компьютере или просто строка в памяти. Например, определить элемент для хранения заголовка книги можно следующим образом:
<book>Tristram Shandy</book>
Элементы также могут содержать в себе другие элементы, так что вы можете модифицировать элемент <book> таким образом, чтобы включить информацию об авторе наряду с заголовком книги в двух подэлементах:
<book>
<title>Tristram Shandy</title>
<author>Lawrence Sterne</author>
</book>
XML-документы могут содержать множество других составных частей; Элементы, текст внутри элементов и атрибуты — все это узлы документа XML(nodes). Один тип узла появляется почти в каждом документе XML. Это объявление XML, и если вы его включаете, оно должно находиться в первом узле документа.
Объявление XML по своему формату подобно элементу, но имеет внутри себя вопросительные знаки и угловые скобки. Оно всегда имеет имя xml и всегда снабжено атрибутом по имени version; в настоящее время единственное допустимое значение для него — "1.0". Простейшая возможная форма XML-объявления такова:
<?xml version="l.0"?>
Данные XML структурированы иерархически. Каждый документ должен иметь единственный корневой элемент, внутри которого содержатся все элементы и текстовые данные. Если на вершине документа находится более одного элемента, то такой документ не считается правильным документом XML. Правильный документ XML:
<?xml version="l.0"?>
<books>
<book>Tristram Shandy</book> <book>Moby Dick</book> <book>Ulysses</book> </books>
Нет ограничений на число подэлементов, которые может содержать элемент. Для правильного документа XML характерно:
Иметь один, и только один корневой элемент.
Иметь закрывающие дескрипторы для каждого элемента (за исключением сокращенного синтаксиса, упомянутого ранее).
Не иметь перекрывающихся элементов — все дочерние элементы должны быть полностью помещены внутри родителя.
Иметь все атрибуты, заключенные в скобки.
Сериализация XML – это процесс преобразования открытых свойств и полей объекта в серийный формат XML для хранения и транспортировки. Десериализация пересоздает объект в его исходном состоянии из вывода XML. Сериализацию можно представить в качестве способа сохранения состояния объекта в поток или буфер.
Для передачи данных между объектами и XML требуется сопоставление из конструкций языка программирования в схему XML и из схемы XML в конструкции языка программирования. XmlSerializer (сериализует объект в поток) и связанные инструменты предоставляют мост между данными двумя технологиями во время разработки и выполнения. Во время выполнения экземпляры классов могут быть сериализованы в документы XML, удовлетворяющие заданной схеме. Аналогично, данные документы XML могут быть десериализованы в объекты времени выполнения.
XmlSerializer обеспечивает преимущество работы с классами строгих типов и, в то же время, обеспечивает гибкость XML. С помощью полей или свойств типа XmlElement, XmlAttribute или XmlNode в классах строгих типов можно считывать части документа XML непосредственно в объекты XML.
При работе в расширяемых схемах XML можно также использовать атрибуты XmlAnyElementAttribute и XmlAnyAttributeAttribute для сериализации и десериализации элементов или атрибутов, не обнаруженных в исходной схеме.
Если свойство или поле возвращает сложный объект (например, массив или экземпляр класса), XmlSerializer преобразует его в элемент, вложенный в рамках основного документа XML.
XmlSerializer предоставляет специальную обработку для классов, реализующих IEnumerable или ICollection. Класс, реализующий IEnumerable, должен реализовывать открытый метод Add, принимающий один параметр. Параметр метода Add должен быть того же типа, что и тип, возвращенный из свойства Current по значению, возвращенному из GetEnumerator, или одним из базовых типов. Класс, реализующий ICollection (например, CollectionBase), в дополнение к IEnumerable должен иметь открытое индексированное свойство Item (индексатор в C#), принимающее целое значение, а также должен иметь открытое свойство Count целого типа. Параметр для метода Add должен быть того же типа, что и тип возвращенного значения из свойства Item или быть одним из базовых типов. Для классов, реализующих ICollection, сериализуемые значения извлекаются из индексированного свойства Item, а не путем вызова GetEnumerator.