- •Лекция 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. Классы прототипы, параметризованные коллекции
- •Создание класса-прототипа
- •//При использовании класса-прототипа вместо параметра т подставляется //конкретный тип данных
- •Ограничения
- •Обобщенные методы
- •Преимущества использования параметризованных классов и методов:
Атрибуты
Атрибуты– это дополнительные сведения об элементах программы, включающие в себя такие метаданные сборки, которые можно извлекать во время выполнения программы. Атрибуты могут быть стандартными и пользовательскими. Все атрибуты описываются в квадратных скобках перед тем членом класса, к которому он относится. Например:
[Serializable]
classMonster
{…
[NonSerialized];
stringname;
…
}
Атрибут [Serializable] означает, что все экземпляры этого класса можно сохранять во внешней памяти, а поле name, помеченный атрибутом [NonSerialized] означает, что данное поле класса будет недоступно.
Пространство имён
Пространство имён – это хранилище типов, определяющее их область видимости. Пространство имён служит для:
логического группирования элементов программы, расположенных в различных файлах;
группирования имён, предоставляемых сборкой в пользование другим модулям.
Директивы препроцессора
В языке C# препроцессор практически отсутствует, однако некоторые директивы перешли в данный язык из языка C++.
Препроцессор- это предварительный этап компиляции, который формирует окончательный вариант текста программы.
Директива препроцессора– указание компилятору исключить или включить в процесс компиляции отдельные фрагменты кода, который должен выполняться при определённых условиях.
В основном в языке C# используются директивы условной компиляции.
Пример использования директив препроцессора
//директива определения символьной константы
//#definevar1 //Определение символьных констант с именамиvar1 иvar2
#define var 2
namespace consoleApplication1
{
class Monster
{
…
# if var 1
static void f () {Console.WriteLine (“Пример1”);}
# else var 2
static void f(){Console.WriteLine (“Пример2”);}
#end if
public void func () { f(); }
…
}
}
При компиляции данной программы можно закомментировать одну из определенных символьных констант, и в зависимости от того, какая переменная определена, такая реализация метода f() и будет участвовать в компиляции.
Лекция 22. Классы прототипы, параметризованные коллекции
Многие алгоритмы не зависят от типов данных, с которыми они работают. Например, такие алгоритмы как сортировка и поиск. Возможность отделить алгоритмы от типов данных предоставляют классы-прототипы, которые в литературе встречаются под названиями “шаблоны классов”, ” параметризованные классы”, ” обобщённые классы”.
Классы прототипы имеют параметр – тип данных и поэтому еще называются параметризованными классами. Чаще всего эти классы применяются для хранения данных, то есть в качестве контейнерных классовиликоллекций.
Существуют “стандартные” классы прототипы, которые называются параметризованными коллекциями. Такие коллекции – это уже готовые шаблоны для различных структур данных – стеков, очередей, списков, бинарных деревьев и т.д. Эти коллекции хранятся в пространстве имёнSystem.Collections.Generic.
Во всех параметризованных коллекциях имеется так называемый параметр в качестве которого обычно выступает тип данных с которым работает эта коллекция.
В качестве примера рассмотрим параметризованную коллекцию List <T>,которая является двойником обычной коллекции (семейства) ArrayList.
Пример применения параметризованной коллекции List <T>
using System.Collections.Generic;
using MonsterLib; //описание классовMonsterиDaemonсмотри в предыдущих //лекциях – данные классы включены в библиотекуMonsterLib
…
static void Main(string[] args)
{
//объявление экземпляра коллекции Listс параметром – типом данных – классомMonster
List<Monster> mas = new List<Monster>();
//добавление в коллекцию объектов класса Mosterи производного от негоDaemon
mas.Add(new Monster ("Вася"));
mas.Add(new Daemon("Демон", 3));
//вывод всех элементов в коллекции
foreach(Monsterxinmas)x.passport();
//объявление экземпляра коллекции Listс параметром – типом данных –int
List<int> masl = new List<int>();
//добавление в коллекцию целых чисел
masl.Add(5);
masl.Add(1);
//применение метода Sort() коллекцииListдля целых чисел
masl.Sort();
//к элементам коллекции можно обратиться по индексу!
int a = masl[0];
Console.WriteLine(a);
//вывод всех элементов в коллекции
foreach(intxinmasl)Console.WriteLine(x+ ” ”);
}
В предложенном примере реализовано две коллекции на основе параметризованной коллекции List<Т>. Первая коллекцияmasсодержит список (аналог одномерного массива) экземпляров (объектов) классов типаMonster. В данной коллекцииmasможно хранить элементы классаMonster, а также любого класса, производного отMonster. Другие типы данных в коллекцииmasнедопустимы.
Существуют параметризованные коллекции с несколькими параметрами, как например, коллекция Dictionary<T,K> - так называемый словарь. У данной коллекции два параметра – тип ключей и тип значений, хранимых в словаре.
В следующем примере демонстрируется применение параметризованной коллекции Dictionary<T,K>.
Пример применения параметризованной коллекции Dictionary <T,K>
В примере программы считывается содержимое текстового файла, считанный текст разбивается на слова и подсчитывается количество повторений каждого слова в тексте.
В качестве ключей в примере используются слова, считанные из файла, а значения представляют собой целочисленные счетчики, которые увеличиваются на единицу, когда слово встречается очередной раз.
using System.Collection.Generic;
using System.IO;
…
static void Main(string[] args)
{
//файл должен существовать!!!
StreamReader f = new StreamReader(@"d:\text.txt");
//считывание содержимого файла в одну строку
string s = f.ReadToEnd();
//массив всех символов-разделителей слов
char[] razdeliteli = { '.', ' ', ',', '!' };
//s.Split(raxdeliteli) – разделение строки на слова, используя разделители. Результат - массив строк(слов) slova
List<string> slova = new List<string>(s.Split(razdeliteli));
//mas – список с параметрами – слово и количество его вхождений, причем слова-это ключи, значения-счетчики вхождений
Dictionary<string, int> mas = new Dictionary<string, int>();
foreach (string w in slova)
{
//если в массиве по ключам(словам) слово встретилось впервые в //значение, соответствующее этому слову заносится 1, если слово //уже встречалось значение увеличивается на единицу
//mas[w]-количество повторений слова w
if (mas.ContainsKey(w)) mas[w]++; else mas[w] = 1;
}
//вывод всех слов в массиве mas по ключам
foreach (string w in mas.Keys)
Console.WriteLine("{0}\t{1}", w, mas[w]);
Console.ReadKey();
}
