- •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. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
1. Жизненный цикл объекта.
Ссылочные объекты выделяются с помощью оператора new. Они живут до тех пор, пока среди всех структур данных существует хотя бы 1 ссылка на этот объект. Если это не так, то объект попадает в сборщик мусора (GC).
Метод Object.Finalize() вызывается перед тем, как объект будет физически разрушен сборщиком мусора. Вообще говоря процесс разрушения объекта можно остановить, т.е., если даже объект попал в сборщик мусора, ссылку на объект можно реанимировать. Но применение подобной технологии очень ограничено.
GC – это фоновый поток, который следит за неиспользуемыми объектами.
В своей работе GC использует особый алгоритм, который позволяет ему оптимизировать процесс разрушения объектов. Узнать в точности, когда объект разрушен или не разрушен по сути дела невозможно, т.е. момент настоящего разрушения объекта недетерминирован. GC накапливает и разрушает объекты по поколениям.
У GC есть несколько методов, которые позволяют узнать размеры поколений объектов и форсировать сборку мусора.
Важнейшие методы: GC.Collect().
Для того, чтобы гарантировать, что некоторый ресурс освобождается в нужный момент времени, предназначен интерфейс IDisposable. У него есть только один метод void Dispose(). Его и надо написать, если класс реализует данный интерфейс.
Ресурс освобождается посредством вызова метода Dispose() в нужной программисту точке.
Реализация метода Dispose() обычно такова:
class MyClass : IDisposable
{
private bool disposed = false;
public void Dispose()
{
if(!disposed)
{
// освобождение ресурса
// подавление метода Finalize()
GC.SupressFinalize(this);
disposed = true;
}
}
}
Блок using автоматически вызывает в конце метод Dispose () всех перечисленных в объявлении объектов.
using (объявление объекта)
{
// действие
}
Объявление объекта представляет собой список объявлений и возможно создания объектов, которые реализуют IDisposable.
2.Делегаты. Назначение, синтаксис объявления, использование делегата. Событийная модель.
Делегат(delegate) - это ссылочный тип, инкапсулирующий метод с указанной сигнатурой и возвращаемым типом. Каждый делегат описывает множество функций с указанной сигнатурой, каждая функция (метод), сигнатура которой совпадает с сигнатурой делегата, может рассматриваться как экземпляр класса, заданного делегатом. Синтаксис делегата:
[<спецификатор доступа>] delegate<тип результата> <имя класса> (<список аргументов>);
Спецификатор доступа может быть опущен, при этом делегат может быть объявлен: 1) непосредственно в пространстве имен, вместе с объявлениями других классов, сигнатур, интерфейсов; 2) внутри другого класса, вместе с объявлениями методов и свойств(как объявление вложенного класса); Делегаты не задают реализацию, а экземпляры делегата можно рассмотреть как ссылки (указатели на функции), при этом методы классов с соответствующей сигнатурой будут рассматриваться как объекты, которые хранятся в динамической памяти, вследствие выполнения произойдет связывание объекта со ссылкой. Применение: делегаты указывают методы, которые могут быть использованы при обработке событий, а также для реализации обратных вызовов в программе. Кроме того они применяются для указания статических методов и методов экземпляра, о которых ничего не известно до этапа выполнения. Также существует и класс Delegate, который является абстрактным классом: public abstract class Delegate: ICloneable, ISerializable. Для абстрактных классов реализация не определена, т.е. нельзя создавать экземпляры класса, но этот класс имеет свойство - их можно комбинировать. Т.е. к экземпляру делегата разрешается поочередно присоединить другие экземпляры делегата того же типа. Поскольку каждый экземпляр хранит ссылку на функцию, то в результате создается список ссылок или список вызовов(invocation list). Когда вызывается экземпляр, имеющий список вызова, то затем в порядке присоединения начинают вызываться и выполняться функции, заданные ссылками. Так один вызов порождает выполнение списка работ. На ряду с операциями присоединения делегатов существует и обратная операция удаления делегатов из списка. К основным методам и свойствам класса Delegate относятся 2 статических метода: Combine(присоединяет экземпляры делегата к списку) и Remove(удаляет).
Combine(список атрибутов); Remove(список атрибутов); Пример: Combine(del1,del2); Remove(del1,del2); Недостаток - необходимо атрибуты явно преобразовывать к нужному типу. Чтобы этого не делать существуют операции «+» и «–», которые добавляют или удаляют делегаты из списка вызовов. Пример: del1 += del2; del1-=del2; Класс Delegate имеет 2 динамических свойства: Method и Target, которые служат для получения подробных сведений о делегате. Свойство Method возвращает объект класса MethodInfo из пространства имен Reflection. Свойство Target возвращает информацию об объекте, вызвавшем делегат, в тех случаях, когда делегат, инициируется не статическим методом класса, а динамическим, связанным с вызвавшим его объектом.