Система типов cts
CTS (common type system) общая система типов
Функции:
Описывает типы данных и операции
Совместимость типов в разных ЯП
Имеет объектно – ориентированную направленность
Категории данных:
Значимые типы
Ссылочные типы
Управление типами в CTS:
Типы могут быть исполнены после инициализации
Над типами 2 рода преобр-й (явные/неявные)
Типы объединяются в совокупности (пространство имён, файлы, сборки)
Ссылочные типы
Типы значения
Упаковка(boxing)- приведения значимого типа к ссылочному
Обнуляемые типы:
Поддержка null – значений для значимых типов
Стандартизация подхода к задаче
Работа только с value Type типами
Чтобы определить переменную, которая может принимать ещё и null значение
Преобразования типов
Явные(explicit):
Когда преобразование к другому типу напрямую несовместимо
Требуют вызова, могут приводить к потере точности
Checked-проверка
long- int, ...
Неявные(implicit):
Когда безопасно
Автоматически, всегда успешно
int- long, float- double, long- float
Оператор перечисления:
Список поименованных констант
Описываются словом enum
Встроено представляется типом INT? Но может быть и другим типом
Сильно типизирован
Тип System.Object базовый класс для всех типов .net , при описании типа по умолчанию наследник System.Object
Важные методы:
equals()- сравн. объекты
ToString()- предст. объекта как строки
GetHashCode()- выч. хеш-кода
Finalize()- уничтожение
GetType()- возвращение метаданных
MemberwiseClone()- кодирует бинарные представления в новую переменную
ReferenceEquals()- сравн. 2 объекта по ссылке
Клонирование объектов:
Создаёт идентичные копии
Копируется значение всех полей
Типы, которые позволяют клонирование
Clone() копирует рекурсивно все поля
Упаковка значимых типов (преобразование значимых типов в ссылочные и наоборот) Boxing-UnBoxing.
Пространства имен и пакеты
Пространство имён:
Много общего с пространством имен в с++ и пакетами в java
Выполняют логическую группировку
Могут содержать в себе классы, структуры, интерфейсы и др. пространства имен
не могут содержать методов и данных
Позв. описывать типы с одинаковыми именами (в различных пространствах)
Могут располагать в одном или нескольких различных файлов
Используются через директиву using
можно и без using, но с полным именем
Пространства имен (namespace) и ссылки
Для проекта могут быть указаны ссылки
Каждая ссылка идентифицирует универсальную сборку
Передается c# компилятору по ссылке
пространства имён дают возможность сохранять именования на уровне ЯП
ссылки указывают на сборку для использования в проекте
Наследование в ооп
Принцип наследования в ооп позволяет создать класс, включающий в себя все данные и методы некоторого другого класса, и, кроме того, содержащий свои, присущие только ему данные и методы обработки. Такой подход позволяет строить целые иерархии классов, каждый следующий уровень которых отличается все большей детализацией по сравнению с предшествующими ему уровнями. Достоинства такого подхода наиболее полно проявляются при программировании достаточно сложных объектов, к которым по праву относится сама операционная система Windows.
Наследование позволяет описать сначала общий класс окна Windows, на его основе описать общий класс диалогового окна Windows, а уже на основе этого класса сформировать класс конкретного диалогового окна, используемого для реализации конкретного пользовательского интерфейса.
Наследование – свойсво произв. объекта сохранять поведение родительского
Описания в виде фреймов и диаграмм
Свойства отношения частного порядка:
рефлексивность
любой a: a is A a
транзитивность
любые a, b, c : a is A b, b is A с => a is A с
антисимметричность
любые a, b : a is A b => NOT (b is A a)
Наследование
основная концепция ООП
в C# классы и стр. могут наследовать
наследуют все члены – поля, методы, свойства…
класс родитель называют базовый класс
класс наследник – дочерний
наследование позволяет установить иерархию типов
в .NET множественное наследование основано на интерфейсах
Реализация наследования в C#
интерфейсы:
описывают совокупность методов и свойств
описывается только прототип метода
могут использоваться для описания абстрактных типов данных
элементы interface не должны быть статическими
классы и структуры могут реализовывать множественные интерфейсы
интерфейс может расширять другой интерфейс
абстрактные классы и методы:
реализуют концепцию полиморфизма
абстрактные методы не имеют реализации
абстрактные методы неявно являются виртуальными
если класс имеет абс. методы, то его нужно описывать как абстракцию
запрещено создавать объекты абст-х классов
Явная реализация интерфейсов:
интерфейс может быть имплементирован явно
можно реализовывать несколько интерфейсов, которые содержат методы с одинаковой структурой
когда член интерфейса имплементирован явно он становится недоступным через сущность класса, но доступен через интерфейс
в .net позволено в одном классе иметь 2 метода с одинаковой сигнатурой с единой явной имплементацией интерфейса
Требования к реализации интерфейсов:
классы наследуют свойство 1 базового класса, но могут реализовать несколько интерфейсов
структура может наследовать свойства любого типа и при этом реализовать множественные интерфейсы
любой элемент интерфейса может реализовать свойство класса
реализованные методы интерфейса нельзя описывать как override а можно как virtual либо abstract.
Классовые диаграммы:
представляют стандарт UML нотацию для изображения классовой иерархии
создают визуальное представление взаимосвязей между классами
классы изображают прямоугольниками в которых заключены и члены
связи между классами изображают в виде стрелок
классовые диаграммы наглядно представляют иерархию классов, полученную при многократном наследовании
Преимущества наследования:
Отсутствие необходимости явного указания свойств и методов для производимых объектов
Гибкое определение уравнения абстракции предметной области
Возможность моделирования сколь угодно сложной предметной области
Простой и прямолинейный подход к построению свойств и методов
Понятие инкапсуляции
Формализация (понятие инкапсуляции в математике)
лямбда – исчисление
лямбда термы выполняют роль объектов
связанные переменные выполняют роль свойств
свободные переменные выполняют роль методов
Комбинаторная логика
Комбинаторы роль объектов
Переменные роль свойств
Комбинаторы роль методов
Инкапсуляция в C#
Степень инкапсуляции:
Public – публичная область видимости
Private – приватная область видимости
Расширение области видимости:
Protected – доступность из класса и классов наследников
Internal – доступность из сборки с описание объекта
Protected internal – доступность из класса с описанием объекта, а также из сборки с описанием объекта
Инкапсуляция полей и констант:
1) Поле:
Инициализация факультативна, однако запрещен доступ к полям и методам того же типа
Поля структуры не подлежат инкапсуляции
2) Константа:
Значение должно быть вычислено в процессе компиляции
3) Поле только для чтения:
Необходимо инициализировать в описании или конструкторе
Значение обязательно должно быть вычислимым в ходе компиляции
Занимает область памяти
Статические поля и константы принадлежат классу а не объекту.
Свойства в C#
Свойства:
Свойства классов, структур и интерфейсов контролируют доступ к полям
Свойства могут иметь 2 компонента:
Программный код для чтения значений
Программный код для присвоения значений
Могут быть:
Только на чтение
На чтение и на запись
Только на запись
Преимущества инкапсуляции:
Унификация моделируемой предметной области
Прямолинейный подход к модификациям предметной области
гибкое управление уровнем абстракции данных
Безопасность и независимость пользователя
Понятие полиморфизма
Полиморфизм позволяет переопределять реакцию объекта производного класса на метод, определенный в базовом классе.
Преимущества полиморфизма:
унификация обработки объектов различной природы
снижение стоимости ПО
повторное использование кода
интуитивная прозрачность исходного текста
строгое математическое основание
концепция является универсальной и в равной степени применимо в ООП
Методы вызова процедур
Методы вызова процедур:
Вызов по значению:
Формальный параметр является копией фактического параметра
Фактический параметр является выполняемым
Вызов по имени (ссылке)
Формальный параметр является подстановкой фактического параметра
Фактический параметр должен быть переменной, формальный параметр является копией фактического параметра
Вызов по необходимости
Значение не передается вызывающей функции
Не следует использовать в методах до того, как значение будет получено
Передача параметров
По умолчанию параметры передаются по значению
Out и ref позволяют передавать параметры по ссылке
Out – можно не инициализировать
Ref – необходимо инициализировать в вызываемом методе, а в вызываемом можно как читать так и записывать
Перезагрузка методов
Исполнение методов, используемых одинаковые имена
Изменение числа, типов и последовательности параметров
можно использование Sqr(int) и Sqr(long)…
Список параметров
В с# можно описывать методы со списком параметров
Для задания параметра, который представляет собой список, используют массив
Компилятор передаёт параметр как массив заданного типа
Обобщения
Итераторы
Назначение:
Определение последовательности обхода множества оператором for each
Перечисление – объект, который реализует интерфейс
Итератор – это средство реализации перечисления
С помощью итераторов можно реализовывать не только перечислители в чистом виде, но и просто методы, которые возвращают IEnumerate или IEnumerator.
Блок итератора отличается от обычного блока наличием одного или более операторов yield.
Yield return – следующий элемент итерации
Yield break – конец итерации
Индексаторы:
Предоставляют индексируемый доступ к данным, подобно доступу к элементам массива
Похожи на свойства, но получают как параметр идентификатор или индекс на элемент, с которым работают
На практике используют описание оператора [] для произвольного типа
Перегрузка операторов изменение программного кода в зависимости от цел. зн-я того или иного метода:
могут перегр-ся унарные и бинарные операторы
не может быть изменён приоритет операторов
не все операторы перегружаемы
описание операторов:
используют описание стат. метода
исп-т ключевое слово operator
имеют 1 или 2 параметра с которыми работает оператор
Индексаторы
Связывание
Понятие события
События в Математике:
Событие – соотнесение над объектом предметной области. Произв. семейство объектов может быть параметризовано не только типами, но и событиями.
События в программировании:
Событие – способ внедрения фрагмента в код с целью изменения поведения программы.
Делегаты – тип, который описывает сигнатуру метода (список, типы и последовательность параметров)
Преимущества СОП:
возможность моделирования произвольных реальных объектов
потенциальная лёгкость настройки интерфейса
программирование основанное на сценариях
гибкость реинженеринга ПО
строгое мат. осн-е (концептуализация)
процент повторного использования кода высокий
Делегаты
Делегаты – тип, который описывает сигнатуру метода (список, типы и последовательность параметров)
Управление событиями с помощью делегатов:
переменная делегат может иметь пустое значение null (метод не неазначен)
пустая переменная делегат не может быть вызвана (искл ситуация)
Переменные – делегаты являются объектами первого рода; их можно хранить в структурах данных, передавать как параметр.
Виды делегатов:
Единичные
Содержат ссылку к одному единственному методу
Наследники класса System.Delegate
Множественные
Содержат связанный список ссылок к методам
Наследник класса System.MulticastDelegate
System.MulticastDelegate
при вызове использует последовательно друг за другом все методы из списка
если multicast делегат возвращает значение или имеет ref или out параметр, результат только последний вызванный метод от списка методов делегата
если при вызове multicast делегата один из методов в списке вызвал исключение, следовательно метод из списка не вызывается
на практике single-cast делегаты почти не используются и под делегатом обыкновенно понимают multicast
События
События:
Используются для уведомления о некотором событии
Объект, вызывающий событие – инициатор (sender)
Объект, получающий событие – получатель (receiver)
Для получения события получатель предварительно подписывается на него
События поддерживаются через делегаты
События в с# специальные сущности делегата, декларированные ключевым словом event
Различия событий и делегатов:
События не эквивалентны члену, переменной типа делегат
События могут быть членами интерфейса, а делегаты не могут
Вызов события может происходить только из класса в котором оно описано
Доступ к событию по умолчанию синхронизирован
Конвенция для событий:
делегат который использует события
имеет имя обретаемое от глагола + EventHandler (SomeVerbEventHandler)
возвращает void и принимает 2 параметра (объект-инициатор типа System.Object и объект, содержащий данные о событии типа, наследника System.EventArgs)
события объявляют как public, начинаются с заглавной буквы и заканчиваются глаголом
Для вызова событий создают protected метод, не имеющий возвращаемого типа
метод-получатель (обработчик) события имеет имя объект_событие
Делегат System.EventHandler:
Описывает ссылку к callback методу, который обрабатывает событие, для которого не нужна дополнительная информация
Часто используется в .net Framework