Классы и его элементы в c#
Статичные методы:
не связаны с сущностью класса
предоставляют статичную функциональность
имеют доступ только к статичным именам
можно вызвать без создания сущности типа, в кот. описаны
похожи на глоб. функции в С++ и Delphi
Статичные поля:
не связаны с сущностью класса, в кот. описаны
как глоб. переменные – имеется только 1 сущность на всё приложение
имеет доступ без создания сущности типа
Частичные типы:
возможность определения классов, структур и интерфейсов в нескольких файлах
задаётся ключевым словом partial
облегчение разработки и сопровождения
разделение кода, написанного человеком и кода написанного машиной
всё что вы пишите в разных частях одного типа, перед компиляцией собирается в один тип
логич. выводы
нельзя расширить уже откомпилированный тип
нельзя указать разные уровни доступа для разных частей одного типа
нельзя указать разные базовые классы
исключение составляет модификатор unsafe
Структуры в C#
Во многих отношениях структуры С# можно рассматривать как некую особую разновидность классов. С классами структуры роднит многое: для структур можно определять конструкторы (только принимающие параметры), структуры могут реализовывать интерфейсы, структуры могут содержать любое количество внутренних членов. Для структур С# не существует единого базового класса (тип System. Structure в С# не предусмотрен), однако косвенно все структуры являются производными от типа
ValueType. Вспомним, что основное назначение ValueType заключается в том, чтобы
обеспечить типы данных, производные от System . Object, членами для работы с эти-
ми типами данных как со структурными (value-based), когда значения передаются
как локальные копии, а не как ссылки на области в памяти.
При создании структуры для нее будет выделена память в области стека и теперь можем обращаться к каждому члену структуры, используя формат имя_структуры.имя_члена. Вполне возможно, что в реальном приложении для более удобного присвоения значений членам структуры нам придется определить
свой собственный конструктор или несколько конструкторов. В связи с этим не-
обходимо помнить, что мы не можем переопределить конструктор для структуры по умолчанию — тот конструктор, который не принимает параметров. Все
ваши конструкторы обязательно должны принимать один или несколько параметров.
Управление памятью в .Net Framework
В ЯП Java, Perl, C# память полностью управляется автоматически garbage collector — сборщик мусора:
Нет необходимости ручного освобождения памяти (+)
Не происходит утечка памяти (+)
Нет возможности повторного освобождения (+)
Ресурсы всегда освобождаются (+)
Становится больше памяти (+)
Некоторые ресурсы требуют ручного управления (-)
Выделение памяти в .Net:
Значимые типы находятся в стеке и уничтожаются при окончании работы
Ссылочные типы находятся в динамической памяти и уничтожаются garbage collector`Ом
Выделение динамической памяти:
вычисляется размер нового объекта
проверяется наличие свободной памяти
при наличии памяти вызывается конструктор для инициализации
если памяти нет, запускается garbage collector
Уничтожение объектов в C#
Финализация – для освобождения памяти:
Все наследники от класса object имеют метод для финализации (Finalized)
Этот метод вызывается у объектов, которые будут уничтожены при очистке памяти
2 структуры для финализации:
очередь финализации (очередь с объектами, которые имеют метод для финализации)
расширенная очередь (очередь с объектами, которые не используются программой и ждут вызова метода с финализацией)
При очистке памяти объекты не уничтожаются немедленно, а перемещаются из 1 очереди во 2ю, в которой все объекты уничтожаются одной нитью
Деструкторы- методы, приводящие к уничтожению объектов
Метод Finalize() не может быть реализован явно, вместо него применяется деструктор
как метод класса, только ~ в начале
Оживление(resurrection)
во время финализации возможно оживление объекта при добавлении ссылки программы к объекту который финализирован
сбор мусора не очищает оживл объект, пока он не будет использован
не рекомендуется оживлять объекты
Метод GC.ReRegister For Finalize()
Интерфейс IDisposable
Finalize не гарантирует освобождение ресурсов, но согласно позволяет освобождать ресурсы вручную
Для этого описывается метод Dispose
Оператор Using гарантирует то, что после завершения конструкции вызывается метод Dispose
Слабые ссылки:
применяются для записи данных, которые не критичны для работы приложения
эти ссылки освобождаются в первую очередь
Пулинг ресурсов – применяется для работы с ресурсами которые часто создаются и уничтожаются
Диаграммы UML
Диаграммы UML
Типизация
Тип – относительно устойчивая и независимая совокупность элементов, которые можно выделить во всём рассматриваемом множестве.
формирование системы типов:
задается множество базисных типов
всякий базисный тип считается типом
если a и b считаются типами, то функция из a в b считается типом и имеет тип a→b
В основе теории типов принцип иерархичности: производные типы содержат базисные как подмножества.
Преимущества типизации:
Лучшая структурированность за счет иерархичности
Разнородные элементы обрабатываются различным образом, однородные единообразно
Строгая типизация фиксирует несоответствие типов до выполнения программы гарантируя отсутствие ошибок и безопасность кода
классификация:
Строгая
Сильная
Слабая
Полиморфная
С контролем соответствия типов во время компиляции
С контролем соответствия типов во время выполнения