
- •Лекция 1. Введение. Платформа .Net. Среда Visual Studio.Net. Консольные приложения
- •Платформа .Net
- •Среда Visual Studio.Net
- •Консольные приложения
- •Заготовка консольной программы
- •Вопросы для самоконтроля
- •Лекция 2. Основные понятия языка Алфавит и лексемы
- •Алфавит с# включает:
- •Идентификаторы
- •Ключевые слова
- •Знаки операций и разделители
- •Литералы
- •Лекция 3. Типы данных с#. Переменные, операции, выражения
- •Встроенные типы
- •Типы-значения и ссылочные типы
- •Упаковка и распаковка
- •Переменные
- •Пример описания локальных переменных
- •Именованные константы
- •Операции и выражения
- •Преобразования встроенных арифметических типов-значений
- •Явное преобразование типа
- •Основные операции с#
- •Решение дз
- •Математические функции – класс Math
- •Лекция 5. Операторы языка c#
- •Блок или составной оператор
- •Пустой оператор
- •Операторы выбора (ветвления)
- •Оператор if
- •If(выражение_1) оператор_1;
- •If(выражение1) if(выражение2) if(выражение3) ...
- •Примеры оператора if:
- •Следует избегать проверки ве5щественных величин на равенство, вместо этого лучше сравнивать модуль их разности с некоторым малым числом:
- •Оператор switch (переключатель)
- •Операторы перехода
- •Оператор goto
- •Операторы break и continue
- •Оператор return
- •Лекция 6. Операторы цикла
- •Цикл с предусловием while
- •While ( выражение ) оператор
- •Цикл с постусловием do
- •Do оператор while выражение;
- •Цикл с параметром for
- •Цикл перебора foreach
- •Рекомендации по выбору оператора цикла
- •Лекция 7. Массивы
- •Одномерные массивы
- •Прямоугольные массивы
- •Класс System.Array
- •Оператор foreach для работы с массивами
- •Примеры обработки массивов с использованием класса Array
- •Лекция 8. Строки
- •Работа с символами в с#
- •Массивы символов
- •Строки типа string
- •Операции над строками
- •Форматирование строк
- •Пользовательские шаблоны форматирования
- •Строки типа StringBuilder
- •Лекция 9. Класс Random. Функции в языке с#
- •Функции (методы) в языке с#
- •Способы обмена информацией
- •Параметры-значения
- •Параметры-ссылки
- •Выходные параметры
- •Модифицированный пример применения выходных параметров
- •Лекция 10. Указатели в языке с# Небезопасный код
- •Синтаксис указателей
- •Указатель void
- •Преобразование указателей
- •Инициализация указателей
- •Арифметические операции с указателями
- •Приоритетность выполнений операций с указателями
- •Указатель на указатель
- •Операция stackalloc
- •Лекция 11. Файлы в с# Основные понятия. Классы .Net для работы с файлами
- •Виды файлов
- •Алгоритм работы с файловыми потоками
- •Байтовые файлы (потоки)
- •Обработка исключительных ситуаций при работе с файлами
- •Текстовые файлы
- •Пример преобразования чисел, содержащихся в текстовом файле
- •Консольный ввод-вывод
- •Работа с каталогами и файлами
- •Лекция 12. Структуры и перечисления в языке с#
- •Перечисления
- •Операции с перечислениями
- •Базовый класс System.Enum
- •Рекомендации по программированию
- •Пример программы с использованием структур с методами и перечислений
- •Лекция 13. Основные понятия ооп. Классы.
- •Данные: поля и константы
- •Виды элементов класса
- •Лекция 13_часть 2. Ооп. Члены класса. Основные свойства ооп
- •Члены класса
- •Свойства и поля
- •Конструкторы
- •Деструкторы
- •Статические члены класса и члены класса экземпляра
- •Интерфейсы
- •Основные свойства ооп
- •3. Полиморфизм
- •Упражнения к лекции
- •Решение дз
- •Лекция 14. Конструкторы. Параметр this. Ключевое слово this
- •Конструкторы
- •Конструкторы класса (статические конструкторы)
- •Класс “ Monster”
- •Свойства класса
- •Рекомендации по программированию
- •Лекция 15. Наследование. Виртуальные функции. Сокрытие методов базового класса. Абстрактные и закрытые классы Наследование
- •Особенности поведения конструкторов при наследовании
- •Пример программы иерархии наследования с использованием конструкторов
- •Синтаксис объявления наследования
- •Виртуальные методы
- •Правила использования виртуальных методов
- •Сокрытие методов базового класса
- •Вызов переопределенных или скрытых методов базового класса
- •Абстрактные классы и функции
- •Правила работы с абстрактными классами и методами:
- •Пример использования абстрактного класса
- •Закрытые (изолированные) классы и методы
- •Лекция 16. Интерфейсы. Использованием интерфейсов
- •Пример описания, реализации и использования интерфейса
- •Void Draw(); //простой метод вывода имени монстра
- •Int Attack(int a); //реализация атаки с заданной силой
- •Void Die(); // метод вывода на экран сообщения о смерти монстра
- •Int Power { get; } //свойство, вычисляющее силу монстра
- •Лекция 17. Семейства. Индексаторы
- •Пример использования семейства System.Collections.ArrayList
- •Определение собственных семейств
- •Индексаторы
- •Пример с использованием собственного семейства
- •Семейства с доступом по ключу и интерфейс iDictionary
- •Индексаторы и пользовательские классы
- •Лекция 18. Перегрузка методов и операций в классах Перегрузка методов
- •Перегрузка операций
- •Перегрузка унарных операций
- •Пример перегрузки унарных операций на примере класса
- •Перегрузка бинарных операций
- •Public static тип_возвр_знач operator бинарная_операция (параметр1, параметр2),
- •Пример перегрузки бинарных операций на примере класса
- •Класс System.Object
- •Пример перегрузки операций сравнения с использованием стандартных методов класса Object
- •Лекция 19. Стандартные интерфейсы. Клонирование. Итераторы Стандартные интерфейсы .Net
- •Сравнение объектов (интерфейс iComparable)
- •Пример использования стандартного интерфейса iComparable на примере класса Monster
- •Сортировка объектов по различным критериям (интерфейс iComparer)
- •Пример использования стандартного интерфейса iComparer на примере класса Monster
- •Клонирование объектов (интерфейс iCloneable)
- •Перебор элементов (интерфейс iEnumerable) и итераторы
- •Пример работы класса с итератором
- •Примеры применения простейших итераторов
- •Лекция 20, 21. Делегаты и события
- •Пример делегата для обычной функции
- •Пример делегата для метода класса
- •1.Делегат для выбора методов на этапе выполнения
- •Delegate.Invoke или что там внутри? (для продвинутых)
- •Пример делегата для работы с несколькими методами
- •2. Делегат как оповещатель. Паттерн «наблюдатель»
- •Пример делегата для оповещения наблюдателей
- •3. Делегат как процедура обратного вызова
- •Пример передачи делегата в качестве параметра функции
- •4.Делегат, как обработчик событий
- •[Cпецификаторы] event тип делегата имя события, где
- •Пример делегата для оповещения наблюдателей с помощью событий
- •Стандартные делегаты
- •Пример стандартного делегата EventHandler для оповещения наблюдателей с помощью событий
- •Лекция 21. Сборки, библиотеки, атрибуты, директивы. Сборка
- •Создание собственной библиотеки
- •Пример создания и использования собственной библиотеки
- •Рефлексия
- •Пример применения рефлексии
- •Атрибуты
- •Пространство имён
- •Директивы препроцессора
- •Пример использования директив препроцессора
- •Лекция 22. Классы прототипы, параметризованные коллекции
- •Создание класса-прототипа
- •//При использовании класса-прототипа вместо параметра т подставляется //конкретный тип данных
- •Ограничения
- •Обобщенные методы
- •Преимущества использования параметризованных классов и методов:
Абстрактные классы и функции
Абстрактными в языке С# могут быть как классы так и функции. Это классы и функции, описанные с ключевым словом abstract.
Часто в базовом классе виртуальные функции фиктивны и имеют пустое тело. Эти функции существуют как некоторая абстракция, конкретное значение им придаётся в производных классах. Абстрактная функция используется для того, чтобы отложить решение о реализации функции. Для абстрактного класса нельзя создавать объекты. Главное назначение абстрактных классов – в определении интерфейса для некоторой иерархии классов.
Абстрактный класс используется только в качестве базового класса для других классов.
Цель определения абстрактного класса - предусмотрение обобщенного базового класса, на основе которого строится иерархия наследования.
Абстрактный класс не может быть использован как тип аргумента и как тип возвращаемого значения функции.
Правила работы с абстрактными классами и методами:
1. Нельзя создать экземпляры абстрактных классов.
2. Абстрактные функции не имеют реализации и должны быть переопределены в любом неабстрактном классе-наследнике.
3. Абстрактные функции автоматически являются виртуальными, но писать слово virtualнельзя.
4. Если класс содержит любую абстрактную функцию, он является абстрактным
Синтаксис объявления:
abstractclassmybase//абстрактный класс
{
public abstract void f(); //абстрактный метод
}
Пример использования абстрактного класса
publicabstractclassX//абстрактный класс
{
publicintx1;
publicabstractvoidf();//абстрактный метод –не имеет реализации!
}
publicclassY:X//производный класс от абстрактного
{
//слово override– обязательно, так как идет замещение базовой реализации, //которой вообще нет!
publicoverridevoidf(){x1=3;Console.WriteLine(x1);}//обязательно методf() должен //быть переопределен в не абстрактном классе
}
class Class
{
static void Main(string[] args)
{
X a=new X();// ОШИБКА!
Ya=newY();
a.f();
}
}
Закрытые (изолированные) классы и методы
С# позволяет объявлять классы и методы как sealed (закрытые). В случае класса это означает, что от него нельзя ничего наследовать. В случае метода это значит, что его нельзя переопределить.
sealed classmy//закрытый класс
{
public sealed override void f();//закрытый метод
}
classderived:my//ОШИБКА
Закрытые классы служат для обеспечения внутренних действий программиста и попытка переопределить функциональность такого класса приведет к ошибкам. Закрытыми классы объявляются также из коммерческих соображений. Так например string-закрытый класс. Но это и ограничивает использованием таких классов.
Смысл объявления закрытым метода (защита авторских прав) – если метод уже переопределен от базового класса и разработчик не хочет, чтобы его переопределяли дальше по иерархии. Такие методы не должны быть виртуальными, а “sealed” говорит о том, что такое переопределение этого метода является “финальным”.
Лекция 16. Интерфейсы. Использованием интерфейсов
Интерфейс - это контракт, обеспечивающий определенное поведение класса или структуры. Когда класс реализует интерфейс, он как бы говорит потенциальному пользователю: “Я гарантирую, что поддерживаю методы, свойства, события и индексаторы этого интерфейса”.
Интерфейс-семейство явно описанных как public - методов и свойств, которые сгруппированы в единое целое и инкапсулируют какую-либо определенную функциональную возможность.
После того как интерфейс определен, его можно реализовать в некотором классе. Это означает, что класс будет поддерживать все свойства и члены, определяемые данным интерфейсом. Интерфейсы не могут существовать сами по себе. таким же образом, как создается экземпляр класса. У интерфейса нет кода, который бы реализовал его члены; он просто описывает эти члены. Их реализация должна находиться в классах, в которых реализован данный интерфейс.
Итак, интерфейс представляет собой альтернативу абстрактному классу в смысле создания контрактов между классами и их пользователями. Эти контракты создаются с использованием ключевого слова interface, которое объявляет ссылочный тип, инкапсулирующий контракт. Синтаксически интерфейс подобен классу, имеющему только абстрактные методы. Абстрактный класс является базовым для семейства производных классов, в то время как интерфейсы задуманы для “смешивания” их с прочими деревьями наследования. Когда класс реализует интерфейс, он должен реализовать все методы этого интерфейса. По сути дела, он соглашается выполнить контракт, определенный интерфейсом.
Правила использования интерфейсов:
Нельзя "создать экземпляр интерфейса"
Интерфейс не может содержать в себе никакого кода
У класса может быть несколько интерфейсов, и несколько классов могут поддерживать один и тот же интерфейс.
У интерфейсов нет никаких конструкторов
Определению интерфейса не разрешено содержать перегрузки операций
Не допускается указывать никаких модификаторов доступа, а также модификаторов virtual,static
Рассмотрим интерфейсы за счет представления полного определения одного из интерфейсов, определенного Microsoft - System.IDisposable. Интерфейс IDisposable содержит один метод Dispose (), предназначенный для деинициализации классами, которые выполняют очистку кода:
public interface IDisposable
{
void Dispose ();
}
Этот фрагмент показывает, что объявление интерфейса синтаксически очень похоже на объявление абстрактного класса. Однако вы должны помнить, что не допускается указывать никакой реализации ни для одного из членов интерфейса.
Интерфейс может содержать только объявления методов, свойств, индексов и событий. Он содержит только сигнатуры членов. Интерфейс не имеет никаких конструкторов, равно как и никаких полей.
Определению интерфейса также не разрешено содержать перегрузки операций.
Также не допускается указывать модификаторы при определении членов интерфейса. Члены интерфейса всегда неявно являются public и не могут быть virtual или static.
Вернемся к определению интерфейса IDisposable. Если класс объявляет, что он реализует метод Dispose (), то он должен будет реализовать интерфейс IDisposable, что в терминах С# означает, что он наследуется от IDisposable.
//Этот класс ДОЛЖЕН содержать реализацию метода IDisposable.Dispose(),иначе-ERROR!
class my: IDisposable
{
public void Dispose() { // реализация метода Dispose() }
// остальная часть класса …
}
В этом примере если класс my будет наследовать IDisposable, но не будет содержать реализации Dispose (), в точности совпадающей с сигнатурой, определенной в интерфейсе IDisposable, будет выдана ошибка компиляции, поскольку в этом случае класс нарушит контракт реализации интерфейса.
IDisposable - сравнительно простой интерфейс, потому что определяет только один метод. Большинство интерфейсов содержат большее число методов.
Другим хорошим примером интерфейса является тот, который представляет цикл foreach в С#. В принципе цикл foreach внутри работает так, что опрашивает объект на предмет того, реализует ли он интерфейс System. Collection. IEnumerable. Он работает так, то компилятор C# вставляет в IL-код, использующий методы этого интерфейса для прохода по всем членам коллекции. Если же нет, foreach генерирует исключение.