- •Структура программы
- •Числовые типы данных на языке c#, правила их преобразования.
- •Нечисловые типы данных на языке с#
- •Условный оператор и оператор выбора
- •Оператор выбора
- •Ввод/вывод в консольном режиме
- •Объявление и инициализация массивов, понятие указателя.
- •Оператор цикла for; организация обработки массивов
- •Оператор цикла while; do while: их сравнение.
- •Цикл foreach
- •Ступенчатые массивы и их обработка
- •Структура и разновидности функций
- •Разновидности формальных параметров-переменных
- •Использование массивов в качестве формальных/фактических параметров и в качестве результата функции
- •Процедурное программирование в c#
- •Принципы Объектно-ориентированного программирования, понятие «объект» и «класс»
- •Объявление классов, атрибуты доступа
- •Конструкторы и деструкторы
- •Перегрузка операторов
- •Индексаторы и работа с ними
- •Свойства и работа с ними
- •Наследование. Работа с конструктором при наследовании.
- •Виртуальные методы, их назначение, правила составления.
- •Абстрактные методы и классы
- •Интерфейсы
- •Делегаты и их использование при работе с функциями
- •Исключительные ситуации
Перегрузка операторов
Цель перегрузки операторов: определение новых правил выполнения существующих операций применительно к созданному пользователем классу. При этом приоритет операций не меняется. Перегрузить можно как бинарные, так и унарные операции, а также операции отношений. Для перегрузки операции необходимо в составе класса задать функцию с новыми правилами выполнения существующей операции; из наиболее известных операторов нельзя перегрузить оператор присваивания (=), а также составные операторы присваивания ( += и т.п.).
Общий формат перегрузки:
public static тип_возвращаемого_значения operator Знак_операции ( операнды )
{// текст функции перегрузки}
Индексаторы и работа с ними
Индексаторы позволяют организовать доступ к элементам одного массива в составе класса через имя класса как для получения значения элемента массива, так и для его изменения. Определение индексатора:
Тип_данных_элементов массива this [int индекс]
{get
{//возврат значения}
set
{ // присвоение значения}
}
Индексатор может иметь и атрибут доступа (по умолчанию как всегда private), индексатор public может обращаться и к массивам private.
Свойства и работа с ними
Свойства – это обобщение понятия данных. Значения свойств можно вычислить на основе значений данных, а также через свойство можно присвоить значения данным. Часто свойство вычисляют на базе нескольких или даже целого множества данных (Например, свойство треугольника -периметр - можно вычислить, зная его стороны; свойство сумма элементов массива на основе . . . ). В таком случае, естественно, вопрос о вычислении данных на основе значения свойства бессмысленный, так как эта задача не решается однозначно.
Определение свойства:
Тип_данных_свойства имя_свойства
{ get {
//получение значения свойства
}
set {
// использование переданного значения свойства
} }
При присвоении значений полям через свойства можно выполнять проверку корректности новых значений. К свойствам, значения которых должны вычисляться, обращаться легче по сравнению с обращением к функциям (не надо заботиться об аргументах).
На использование свойств налагаются довольно серьезные ограничения. Свойству не соответствует поле памяти, оно лишь представляет данные. Поэтому его нельзя передавать методу в качестве ref- или out-параметра. Свойство не должно изменять состояние базовой переменной при вызове get.
Наследование. Работа с конструктором при наследовании.
В C# допускается простое наследование: каждый класс может иметь только одного предка. Используя наследование, можно создать базовый класс, который определяет характеристики, присущие множеству связанных объектов. Этот класс затем может быть унаследован другими классами с добавлением в каждый из них своих особенностей. Равнозначные термины: базовый класс – класс наследник; родительский класс – дочерний класс; класс предок – класс наследник.
При создании экземпляра класса, имеющего предка, запускаются все конструкторы: в первую очередь конструктор базового класса и затем конструктор класса – наследника.
При наличии большего количества уровней наследования подряд будут запущены конструкторы всех уровней иерархии, начиная с базового.
Если конструкторы не имеют формальных параметров, то при этом никаких проблем не возникает: каждый конструктор независимо от других выполняет свои операторы. Осталось решить вопрос: как обеспечить передачу параметра (ов) конструктору класса – предка, в нашем случае конструктору 2. Проще всего это выполнить с помощью списка инициализации в конструкторе класса – наследника.
public proc1(int k1, int k2): base(k1)
{
q = k2;
}
Запись base(k1)означает, что конструктору базового класса в качестве фактического параметра будет передано значение к1.