- •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. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
25. Конструкция from…select… Разделы конструкции. Условия. Проекция. Анонимные типы данных.
Данная конструкция называется проектором, потому что проектирует, или транслирует, данные внутри запроса в форму, удобную для применения. В запросе LINQ конструктор select используется для производства конечного результата запроса. Если в выражении запроса присутствуют фильтрующие конструкции, они должны предшествовать select. Фильтры состоят из ключевого слова where, за которым следует выражение предиката. Конструкция where транслируется в вызов расширяющего метода Where как лямбда-выражение. Вызовы Enumerable .Where, которые используются, если вы выполняете запрос на типе IEnumerable, преобразуют лямбда-выражение в делегат. И наоборот, вызовы Queryable .Where, которые используются, если вы выполняете запрос к коллекции через интерфейс IQueryable, преобразуют лямбда-выражения в деревья выражений. Компилятор преобразует конструкцию select в вызов распределяющего метода select. Тело конструкции select конвертируется в лямбда-выражение, которое передается в метод select, использующий его для производства каждого элемента результирующего набора. select new {Input =… Output =…}
Каждый запрос начинается со слова from. Конструкция from – это генератор, который также определяет переменную диапазона – локальную переменную, используемую для представления каждого элемента входной коллекции, по мере применения к нему выражения запроса. Конструкция from похожа на оператор foreach в стиле императивного программирования, а переменная диапазона идентична по своему предназначению переменной итерации в том же foreach. Запрос может содержать более одной конструкции from. Тогда будет более 1 переменной диапазона: Var….. = from … in…
from … in…
select new {…}
Семейства классов, не делающих больше ничего, кроме предоставления свойств, встречаются довольно часто.
Класс коллекции, способный хранить экземпляры этого класса, тогда мог бы служить представлением множества строк в этой таблице. Такое применение классов является вполне допустимым.
Анонимные типы предлагают способ для упрощения этой модели программирования. В частности, они позволяют не определять никаких простых типов для хранения данных, а использовать вместо этого компилятор С# для автоматического создания типов на базе данных, которые в них нужно хранить.
В качестве альтернативного варианта можно использовать для этого и анонимный тип,
var curry = new { MainIngredient = "Lamb", Style = "Dhansak", Spiciness = 5 };
Используется ключевое слово var. Объясняется это тем, что у анонимных типов нет идентификатора, который можно было бы использовать разработчику. На самом деле, на внутреннем уровне у них все-таки есть идентификатор, но для использования разработчиком в своем коде он не доступен. Во-вторых, никакое имя для типа после ключевого слова new не указывается. Именно благодаря этому компилятор и узнает, что требуется использовать анонимный тип. IDE-среда распознает определение анонимного типа и соответствующим образом обновляет данные IntelliSense.