ВВЕДЕНИЕ в C#
Меню раздела 1.
В этом разделе Вы познакомитесь с базовыми понятиями языка C# - понятиями
класса и объекта, их взаимосвязями и принципами работы с ними. Вы
изучите основные типы данных, разберётесь в принципах работы управляющих
конструкций и циклов. В данном разделе даются базовые инструменты, на которых
строится все дальнейшее обучение.
В курс вошли 25 уроков общей продолжительностью
12 часов и 5 минут.
Урок 1 -
Понятие класса, объекта
Продолжительность: 18 минут
Этот урок является вводным и направлен на правильное формирование у Вас
понятий объектно-ориентированного программирования
Что представляют из себя понятия
класса и объекта. Каким образом эти сущности взаимосвязаны между собой, что
общего в них и какие имеют различия;
Какие члены могут
определять в себе классы и как они реализовываются в объектах;
Два главных правила
следование которым избавит от типичных ошибок начинающего программиста на С#;
Разберем пример из
жизни, который наглядно демонстрирует взаимосвязь класса и объекта;
Узнаете, при каких
условиях возможно создание объекта. Ознакомитесь с последовательностью
создания классов;
Почему данный урок
следует досконально разобрать перед тем, как приступать к изучению следующих;
В чем главный смысл
постулатов, изложенных в данном уроке.
Урок 2 - Структура первой программы
Продолжительность: 38 минут
В этом уроке мы начнем работу непосредственно в Visual Studio
Первое знакомство со
средой разработки VisualStudio 2008. Разбор базовых инструментов и способов их
размещения на рабочем поле;
Последовательность
действий, необходимых для правильного создания первого проекта в VisualStudio
2008;
Как организована
структура любого проекта. Варианты открытия исполняемого файла;
Как в коде исполняемого файла определить заготовку класса;
Что такое точка входа в программу. Метод Main(). Ознакомление с базовым синтаксисом определения методов;
Ознакомление с ключевыми словами static и void;
Как сохранять отдельный файл и как сохранять весь проект. Первый запуск проекта;
Первое знакомство с встроенным классом Console. Ввод и вывод входной информации в процессе работы приложения;
Как
добавлять комментарии в коде программы. Синтаксис добавления комментариев;
Создание переменных. Для чего создаются и как используются переменные. Оператор присваивания.
Урок 3 - Пространства имён
Продолжительность: 40 минут
В данном уроке Вы познакомитесь с понятием пространства имён
Пример из жизни -
неразбериха с идентификацией личности;
Разбор случая когда без пространств
имён не обойтись;
Как выглядят пространства
имён в коде программы. Разбор синтаксиса объявления пространств имён;
Первые понятия о границах
пространств имён, классов, методов. Определение области действия данных понятий;
Как доступаться к
необходимому методу, который заключён в пространстве имён. Знакомство с
модификатором public;
Интерпретирование и решение первой
ошибки, допущенной при разработке;
Повышение удобств c
подключением пространств имён используя ключевое слово using;
Какие два правила необходимо знать
что б эффективно использовать пространства имён;
Какая ещё причина того, что
в платформе .NET используются пространства имён.
Урок 4 - Типы данных
Продолжительность: 23 минуты
В данном уроке Вы познакомитесь с категориями типов данных и способом их
размещения в памяти
Пример из жизни -
практичность использования пространств имён участвуя в командной разработке;
Что означает ситуация относительно
C# когда говорится что C# является языком со строгой типизацией;
Каких видов бывают типы
данных. Основные различия значимых и ссылочных типов данных;
Стек и управляемая куча. Что за
странные понятия, и каким образом они связаны с типами данных;
Каким типам данных следует
отдавать предпочтение, что б максимально повысить скорость работы приложения;
Принцип работы стека. Правило
помещения и извлечение данных из стека;
Управляемая куча и
ссылочные объекты - игрушка с дистанционным управлением?! Пульт управления
называем ссылкой на данные;
Разбор встроенных значимых типов.
Зачем существует множество всевозможных вариантов числовых типов - либо учить
типы, либо покупать больше памяти.
Урок 5 - Типы данных (продолжение)
Продолжительность: 36 минут
В этом уроке мы продолжаем изучение переменных на примере практической работы с
ними
Как соединять между собой
данные нескольких строковых переменных;
В каких случаях вылетает ошибка при
использовании не установленных переменных и как она решается;
Другой вариант комментариев
- многострочный комментарий;
Иной, быстрый способ задания
переменной;
Работа с несколькими
переменными на примере выполнения арифметических операций над ними;
Главное правило, которое следует учитывать при работе с целочисленными типами во избежание потери данных при вычислениях;
Ещё один вариант определения переменных;
Инкремент, декремент и их вариации;
Подводим итог: локальные переменные - основные отличия от глобальных переменных. Область видимости этих двух типом переменных. Другое название глобальных
переменных.
Урок 6 - Константы
Продолжительность: 14 минут
В этом уроке мы с Вами научимся использовать дробные типы и познакомимся с
константами
Знакомимся с типом double.
Синтаксис занесения значения в переменную типа double;
Примеры работы с дробными числами.
Когда следует использовать тип float;
Уточняем моменты,
связанные с автоматической установкой в значения по умолчанию полей различных типов
данных;
Что такое литерал и почему его использование напрямую в вычислениях не приветствуется;тствуется;
Определение понятия констант и определение случаев для их удачного использования. Синтаксис определения констант;
Особенности доступа к константам определённых на уровне класса.
Урок 7 - Переполнение
Продолжительность: 43 минуты
Очень важный урок о необходимости контроля правильности выполнения увеличения
(уменьшения) значения в переменной
Думаете 2147483647 * 2 =
4294967294? Ошибаетесь, - результат составляет "-2". Ловушка, на которую попадается
каждый новичок;
Разбор по косточкам действия
механизма переполнения;
Предотвращение искажения
результатов при помощи инструкции checked;
Первое знакомство с конструкциями
try-catch. Принцип работы данного оператора, предотвращающего аварийное
завершение работы приложения;
вариация
использования конструкции checked для проверки множества возможных переполнений;
Сколько точек входа в программу
может быть? Использование нескольких методов Main в одном приложении;
Примеры по работе с использованием значений переменных и примеры занесения значений в переменные - невидимый подвох.
Задание на самостоятельное решение.
Урок 8 -
Проверка домашнего задания
Продолжительность: 8 минут
В этом уроке мы на разборе примера домашнего задания закрепляем навыки по работе с операциями инкремента и декремента
Расстановка точек над "и"
относительно инкремента и декремента.
Урок 9 -
Конструкция if-else
Продолжительность: 43 минуты
В этом В этом уроке Вы узнаете о возможных направлениях выполнения программного
кода, а также изучите управляющую конструкцию if-else
Повторение и закрепление
знаний относительно очерёдности выполнения операторов в коде программы;
На
схематическом примере знакомимся с возможными препятствиями для текущего направления выполнения кода;
Множественные
разборы всевозможных синтаксических конструкций.
Урок 10 -
Конструкция if-else-if
Продолжительность: 46 минут
В этом В этом уроке мы рассмотрим расширенный вариант конструкции if-else
конструкцию if-else-if на очень важном примере
поиска наименьшего целого делителя для числа
Определение ключевой логики
работы алгоритма поиска наименьшего целого делителя. Оператор деления по модулю;
Создаем эффективный код с
наименьшими усилиями заменив громоздкие вложения if-else на обычную
последовательность else-if;
Исправление типичной скрытой
неточности в работе приложения с помощью составных условных операторов;
Расширение функциональности
приложения путём добавления интерактивности. Работа с классом Convert;
Учет возникновения нештатных
ситуаций в работе приложения, вариант 1 - блоки try-catch. Остальные варианты
оставляем на потом.
Рассмотрение таблицы логических операторов - аналог таблицы умножения в математике;
Урок 11 -
Тернарный оператор
Продолжительность: 9 минут
В этом уроке приводится ещё одна очень полезная вариация управляющей конструкции if-else
Знакомство с однострочной
записью условного оператора на новом примере;
Работа с типом byte;
В каких
случаях имеет смысл использовать именно тернарный оператор, а не обычный
if-else? Почему тернарный оператор является не полной заменой конструкции
if-else?
Урок 12 - Конструкция SWITCH-CASE
Продолжительность: 26 минут
В этом уроке мы рассмотрим часто применяемую конструкцию выбора switch-case
Другая конструкция ветвления-выбора - лучшая альтернатива if-else-if при выборе
из множества;
Главное достоинство -
проверка нескольких условий и выбор соответствующего поведения. Синтаксис
определения блока switch-case;itch-case;
Закрепление теоретических знаний на
примере создания простого вычислителя номера дня недели;
Какой
главный нюанс следует знать при работе с конструкцией swith-case и как его
успешно использовать с личной выгодой;
Какие
типы данных допустимо использовать в блоке выбора switch-case. Преимущества
использования констант.
Урок 13 -
Конструкция while
Продолжительность: 31 минута
В этом уроке рассматриваются принципы циклической формы выполнения набора
операторов. Знакомимся с конструкцией цикла while
Обзор преимуществ данной
конструкции на примере вывода чисел от 1 до 10. Синтаксис записи оператора
while. Повышение гибкости и сокращение времени на кодирование;
Акцентирование внимания на ключевых
моментах цикла while;
За чем следует следить, что б
избежать зацикливания. Эффективное использование бесконечных циклов;
Какие типы данных возможно использовать в блоке выбора switch-case. Преимущества использования констант.
Урок 14 -
Конструкция while (продолжение)
Продолжительность: 23 минуты
В этом уроке на новом примере мы ещё дальше углубляемся в понимание цикла while
Остановка на правилах
именования переменных, пространств имён и т.д.;
Устраняем типичные ошибки с помощью
конструкций обработки исключительных ситуаций;
Повышение гибкости работы
приложения - применение инструкции break.
Урок 15 -
Устранение ошибок
Продолжительность: 21 минута
Исключительно практический урок направлен на решение всех проблемных мест примера из прошлого урока
Очень полезный урок дающий понять важность вылова всех ошибок
и повышения удобства при работе с приложением в реальной жизни разработчика.
Урок 16 -
Конструкция do-while
Продолжительность: 30 минут
В этом уроке мы разберём другой вариант конструкции while - конструкция с постусловием do-while
Синтаксический разбор конструкции do-while и определение главного отличия в работе по сравнению с инструкцией while;
Что следует помнить при применении цикла do-while?
Практическое применение цикла do-while на примере создания простого калькулятора,
применяя все полученные ранее знания.
Урок 17 -
Конструкция do-while (продолжение)
Продолжительность: 29 минут
В этом уроке продолжаем работать с предыдущим примером, проводя полное тестирование приложения
Знакомство со свойствами экрана и внешнего вида выводимой информации;
Выводим звуковые системные сигналы.
Урок 18 -
Конструкция for
Продолжительность: 44 минуты
В этом уроке мы выучим самый часто используемый цикл - конструкцию for
Синтаксический разбор конструкции for. Главное отличие от цикла while;
Работа с циклом for. Использование методов класса Math для сложных математических преобразований;
Несколько практических хитростей для быстрого форматирования на экране сложных элементов;
С помощью C# шпаргалки для себя моментально создаём всё сами при необходимости;
Выводим таблицу умножения с помощью цикла for.
Урок 19 -
Конструкция for (продолжение)
Продолжительность: 26 минут
В этом уроке мы познакомимся со всеми возможными вариантами использования цикла for
Считаете, что после определения цикла for нельзя ставить оператор ";"?! Ошибаетесь. А как на счёт понимания парного оператора "{}"? Новый взгляд на знакомые вещи;
Более сложные варианты определения цикла for;
Эффективное применение циклов для вывода числовых последовательностей - рядов.
Урок 20 -
Ключевое слово continue
Продолжительность: 25 минут
В этом уроке мы познакомимся с очень полезным, простым и удобным в использовании ключевым словом continue
Насколько применение инструкции continue позволяет избежать применения громоздких конструкций проверок условий if;
Рассмотрение на показательном примере отличий в работе инструкций continue и break;
Зачем и когда удобно зацикливать конструкцию for - аналог цикла while.
Урок 21 -
Тип char
Продолжительность: 25 минут
В данном уроке мы поработаем с типом char, а также рассмотрим главные отличия данного типа и типа string
Тип char, некая
замена типа string. Три варианта занесения значения в переменную типа char;
Особенности приведение типа
char в тип int и обратно;
Плохая альтернатива
типу char тип string. В чём заключается основной недостаток;
Как заносить данные типа
char в тип string. Специальные два метода для осуществления этого;
Маленькая
хитрость для мгновенного обхода проблем конвертации типа char в тип string, о
которой мало кто знает.
Разбор динамических методов типа char
Примеры работы с некоторыми динамическими методами типа char.
Урок 22 -
Тип char (продолжение)
Продолжительность: 26 минут
В этом уроке мы напишем рабочее приложение для моделирования составления
расписания занятий тренера в плавательном бассейне
Создание механизма
выбора тренером целевой дорожки и использование метода IsDigit для
предотвращения неправильной работы приложения в случае введения неверных данных;
Повышение гибкости
приложения с помощью использования бесконечного цикла while;
Простое решение
типичной проблемы возникновения ошибки при превышении лимита типа char.
Обработка исключений;
Оттачивание работы конструкции блока обработки; исключительных ситуаций;
Отменный метод для сравнения символов.
Урок 23 -
Тип string
Продолжительность: 42 минуты
В этом уроке мы детальнейшим образом разбираем всю подноготную типа string
Что представляет из себя тип string и в какой области памяти размещается;
Что общее имеет тип string с простыми типами и в чём его главное отличие;
Варианты создания переменной типа string и занесения в неё значений;
Какое ограничение накладывается на литералы типа string;
Особенности занесения в строковые переменные знаков кавычек. Использования управляющих символов форматирования строки;
Правильное форматирование задания пути к файлу. Дословные строки;
Что нужно знать, применяя управляющие символы в дословных строках;
Случайное и преднамеренное экранирование управляющих символов;
Более высокий уровень форматирования - класс Environment;
Выводим свой компьютер "на чистую воду" - определение с помощью методов класса Environment параметров Вашего компьютера;
Использование параметров для формирования и форматирования строк из отдельных литералов и переменных;
Множество примеров форматирования вывода дат, времени, валюты, дробных чисел, в разных системах счисления ... с помощью флагов форматирования.
Урок 24 -
Тип string (продолжение)
Продолжительность: 42 минуты
В этом уроке мы продолжаем углублять свои знания относительно работы с данными типа string
Разбираем статические члены класса string. Метод поиска элемента в строке, определение количества символов в строке, увеличение длины строки до требуемой путём добавления новых требуемых символов,
удаление любой последовательности символов из строки в любом месте, замена определенных символов другими;
Какие статические методы способны принимать для обработки строки, а какие могут принимать ещё и одинокие символы;
Приводим текст к верхнему регистру, к нижнему, удаляем лишние пробелы;
Лепим строки без ограничений быстро, быстро копируем строчные переменные;
Метод string.Copy - особенность работы метода;
Первое знакомство с индексаторами - как вывести n-й символ строки;
Стринговый тип - это всего-навсего набор отдельных символов char-типа?!
Какие есть средства для сравнения строк, и какие
из них следует использовать. Отличие оператора "==" и метода Equals;
Разбираемся в важных нюансах при определении равности строк;
Работаем с методом CompareTo;
Очень полезный метод Object.Equals для определения полного "ссылочного" соответствия строковых переменных. Разбор логики сравнения;
Особенности копирования одной строковой переменной в другую;
Изучаем работу полезного метода форматирования строк string.Format. Повышение гибкости построения кода динамического формирования строк.
Урок 25 -
Тип string (продолжение)
Продолжительность: 18 минут
В этом уроке мы продолжаем углубляться в тип string, изучаем класс StringBuilder
Вникаем в концепцию строк с позиции платформы .NET. Понимаем ограничения обычного использования строкового типа;
Почему при проектировании серъёзных приложений следует избегать использования обычного класса string;
Почему тип string называют неизменяемым, т.е. immutable;
Что необходимо предпринять, что б иметь возможность использовать возможности класс StringBuilde;
Практическое исследование методов класса StringBuilder дублирующих методы класса string;
Когда всё же не следует применять класс StringBuilder.
Перейти к форме заказа
ОСНОВЫ ЯЗЫКА C#
Меню раздела 2.
В этом разделе мы войдём в само сердце объектно-ориентированного C#.
Познакомимся с фундаментальными понятиями, разберём по косточкам две точки опоры платформы .NET -
значимые и ссылочные типы, много, очень много времени уделим методам...
В уроках данного раздела знания, полученные из первого раздела систематизируются, даётся взгляд с научной точки зрения.
Можно сказать, практика предыдущего раздела закрепляется теорией из следующих уроков.
В курс вошли 36 уроков общей продолжительностью
16 часов и 29 минут.
Урок 1 -
.NET-типы и C#-типы. В чём разница?!
Продолжительность: 19 минут
В этом уроке мы подробно рассмотрим систему типов платформы .NET
Как узнать тип переменной,
если её создавали не Вы? Метод GetType;
Почему метод GetType показывает тип не тот, что мы ожидаем получить?
Понятие псевдонима типа;
Рассмотрение иерархии типов платформы .NET;
Главный родительский класс Object;
Подробное рассмотрение всех типов пространства .NET framework;
Особенность типов, относящихся к группе ValueType;
Взаимосвязь ссылочных и значимых типов. Главное отличие.
Урок 2 -Оператор new
Продолжительность: 32 минуты
Поясняется принцип создания пользовательских типов и дается синтаксис объявления пользовательского класса и форма для создания его объектов.
Мы уже работаем в принципах ООП?!
Создание пользовательского типа путем добавления в программу своего класса;
Добавление переменных в пользовательский класс - полей;
Создание переменной пользовательского типа;
Создание объекта - экземпляра класса. Оператор new;
Понятия "класс" и "тип" - что общего;
Откуда знать какой группы типов создаётся пользовательский тип;
Варианты создания новых объектов и ссылок на них;
Почему для установки переменных ссылочных типов использование лишь оператора "=" не достаточно?
Особенности помещения объектов в "управляемой куче".
Урок 3 -Доступ к членам объекта
Продолжительность: 30 минут
Здесь Вы увидите, как доступаться к членам конкретного объекта некоторого класса
Главное правило, которого следует придерживаться при создании объектов;
Вопросы совместимости типа объекта и типа соответствующей ему ссылки;
Синтаксис доступа к членам объекта класса;
Модификаторы доступа - что это и для чего существуют?
Как правильно определять какой модификатор доступа использовать в данный момент?
Взаимная работа полей разных объектов одного класса;
Понятие сигнатуры.
Урок 4 -Массивы
Продолжительность: 31 минута
В этом уроке мы познакомимся с массивами и узнаем, как создавать и работать с ними в коде программы
Что такое массив и чем он отличается от обычных переменных;
В чем удобство использования массивов;
Массив - удобство, скорость, безопасность;
Синтаксис создания массивов. 3 способа добавления элементов в массив;
Любой массив - переменная ссылочного типа?
Великолепная пара - массив и цикл;
Осторожность при работе со свойством массива Length;
Лучшая альтернатива циклу for - специальный цикл foreach-in.
Урок 5 -Массивы (продолжение)
Продолжительность: 31 минута
В этом уроке мы углубляемся в понимание массивов, работаем с более сложными примерами и разбираем класс Array
Более сложные примеры занесения типов в массивы;
Строки и массивы. Взаимные представления. Сортировка массива, изменение порядка следования элементов, реверс массива;
Как сортировать массив пользовательского типа, очищать и копировать.
Урок 6 -Многомерные массивы
Продолжительность: 30 минут
В данном уроке мы рассматриваем широкую тему многомерных массивов и формы их существования
Полезные примеры использования массивов;
Как представлять изображение массивом;
Как создаются и функционируют двумерные массивы;
Как выполнять проход по элементам двумерного массива;
Многомерные массивы. Зачем существуют и как они организованы. Пример разложения числа по битам.
Урок 7 -Многомерные массивы (продолжение)
Продолжительность: 28 минут
После просмотра данного урока, в котором выполняется работа с многомерными массивами в реальном примере, у Вас заложатся прочные навыки по работе с массивами
Как используя метод ToString быстро представить число
в требуемой системе счисления избегая лишнего кода;
Демонстрируем элементы числовых двоичных преобразований, выполняемых в центральном процессоре компьютера на примере трехмерного массива;
Как красиво выводить содержимое массива на экран;
Заканчиваем с побитовым разложением числа.
Урок 8 -Многомерные массивы (продолжение)
Продолжительность: 29 минут
Этот урок мы рассмотрим ещё один вариант многомерных массивов - неровные (Jagged), или рваные массивы
Что такое неровные массивы - массивы массивов;
Почему неровные массивы называют рваными. Как извлекать пользу их рваных массивов;
Действительно ли каждый элемент рваного массива также является массивом?
Синтаксические особенности доступа к элементам рваного массива;
Как заставить массив принять в себя данные разных типов.
Урок 9 -Методы без возвращаемых значений
Продолжительность: 36 минут
В этом уроке мы наконец то разберем, что же такое методы. Кинем пристальный взгляд на условия создания методов класса
Что такое методы и как определять их в пользовательских классах. Полная сигнатура методов;
Правила и условия правильного определения методов в классе;
Момент начала выполнения метода и момент завершения выполнения метода;
Методы призваны управлять полями;
Почему методы эффективно вызывать в цикле;
Почему иногда методы называют методами доступа;
Методы вызывают другие методы.
Урок 10 -Методы возвращающие значения
Продолжительность: 32 минуты
В данном уроке работа ведётся с методами, которые возвращают значения. Акцентируется внимание на особенности осуществления возврата данных из метода
Для чего из метода возвращать значения;
С помощью какого оператора выполняется вывод данных из метода. Оператор return. Правила использования этого оператора;
В каких случаях метод завершает своё выполнение не выполнив все операторы;
Хитрое использование типа bool для возвращаемого значения;
Оператор return позволяет сокращать объем логики в сравнении с использованием оператора else конструкции if.
Урок 11 -Методы с принимаемыми аргументами
Продолжительность: 28 минут
Завершаем первое знакомство с методами и рассматриваем последний аспект - передача в метод данных
Какого размера следует создавать методы;
Синтаксис определения метода с принимаемыми аргументами;
Какие правила определения принимаемых параметров;
Как и по какому принципу следует передавать данные в вызываемый метод;
Особенности передачи параметров - что происходит с аргументами и что происходит с параметрами.
Урок 12 -Создание простейшего калькулятора
Продолжительность: 33 минуты
В данном уроке мы разработаем простейший калькулятор, используя знания о методах
Создаем метод для вывода инструкций по использованию калькулятора;
Используем циклы и операторы выбора из списка для выяснения действий пользователя;
Построение сложных математических вычислений - степень, логарифм, экспонента.
Урок 13 -Немного о рекурсии
Продолжительность: 50 минут
Этот урок посвящен одной щепетильной теме, с которой напрямую связаны методы - понятие рекурсии, а также различия в использовании полных и частичных логических операторов
Понятие рекурсии. Определение;
Демонстрация работы рекурсии на примере вычисления факториала числа
Выяснение действительных шагов вызова одного и того же метода в цикле рекурсии;
В рекурсии всё поставлено задом наперёд. Почему следует избегать использования рекурсии;
Демонстрация разительной разницы в работе разных вариантов логических операторов;
К чему приводит неправильное понимание принципа действия каждого логического оператора.
Урок 14 -Понятие области видимости
Продолжительность: 25 минут
В этом уроке мы определяем понятие области видимости и выясняем ключевые моменты данного явления
Почему незнание правил действия области видимости исключает успешную работу разработчика?
Определение понятия области видимости;
Область видимости полей класса, полей объекта;
Область видимости полей класса пользовательского типа;
Вложенные типы данных;
Область видимости в классах. Область видимости в методах;
Область видимости в циклах;
Единственное правило фигурных скобок для определения области видимости.
Урок 15 -Перегрузка методов
Продолжительность: 40 минут
В этом уроке мы познакомимся с отличнейшим инструментом C# - перегрузкой методов
Разбор понятия перегрузки методов, зачем пользоваться перегрузками. Синтаксис определения перегруженного метода
Как перегрузка методов способна сэкономить время разработки приложения и повысить его простоту;
Выгоды, которые дают перегрузки. Типы перегрузок.
Урок 16 -Перегрузка методов (продолжение)
Продолжительность: 40 минут
Здесь Вы поработаете с перегрузками методов в консолидации с массивами
Почему понимание принципов, данных в данном уроке, чрезвычайно важны для успешного дальнейшего продвижения в понимании C#;
Определение и использование массива пользовательского типа;
Разбираем
по косточкам простой (для понимания) и сложный (при использовании) механизм использования пользовательского типа в вычислениях перегруженного метода;
Прикосновение к понятию инкапсуляции;
Закрепляем знания по перегрузке методов, плюс выясняем ограничения перегрузок.
Урок 17 -Конструкторы
Продолжительность: 40 минут
Здесь Вы познакомитесь с понятием конструкторов и на практических примерах
поработаете с их перегрузками
Что такое конструкторы и для чего они существуют;
Правила определения конструкторов. Конструкторы по умолчанию;
Синтаксические особенности объявления конструкторов;
Конструктор - частный случай методов;
Понимание принципа работы конструктора;
Почему следует всегда помнить о моменте вызова конструктора;
Перегрузка конструкторов - наивысшее удобство;
Закрепляем навыки использования перегрузки конструкторов на примере разработки приложения бронирования номеров;
Когда следует переопределять конструктор по умолчанию.
Урок 18 -Ключевое слово this
Продолжительность: 21 минута
В этом уроке мы узнаем о первом варианте полезного применения оператора this
Какие накладные расходы возникают при перегрузке конструкторов;
Как с помощью оператора this оптимизируется использование перегрузок конструкторов. Понятие переадресации вызовов;
Что следует знать для наиэффективнейшего использования оператора this;
Ещё одно назначение ключевого слова this - избегание неоднозначностей при именовании переменных.
Урок 19 -
Статические поля
Продолжительность: 31 минута
В этом уроке Вы наконец-то поймёте назначение ключевого слова static
Обобщаем и подытоживаем накопленные знания относительно динамических членов класса;
Вспоминаем принцип работы динамических полей и методов;
Осмысление назначения статических членов. Особенности определения статических полей;
Синтаксис доступа к статическим членам;
В чём главная особенность поведения статических членов;
Как организованы в памяти статические поля;
Какое правило следует знать для эффективной работы со статическими методами;
Разрушаем миф о том, что со статическими данными могут работать только статические методы;
Прекрасный пример для закрепления понимания работы статических членов;
Когда выделяется память под статическое поле и когда оно разрушается.
Урок 20 -Статические методы, конструкторы
Продолжительность: 29 минут
В этом уроке мы с Вами разберём все тонкости в работе со статическими методами и статическими конструкторами
Статические методы могут работать только со статическими полями и другими статическими методами;
Как заставить статический метод работать не только со статическими данными;
Пример с использованием статического конструктора;
Когда полезно использовать статический конструктор;
Реальный пример из футбола, демонстрирующий сущность статических членов;
Когда и сколько раз может быть вызван статический конструктор. Кем может быть вызван статический конструктор;
Синтаксические особенности объявления статического конструктора, что следует помнить всегда;
Можно ли перегружать статический конструктор - нельзя;
Несколько слов о том, как с помощью конструкторов запретить возможность создания объектов соответствующего класса.
Урок 21 -Статические классы
Продолжительность: 35 минут
Здесь мы систематизируем знания относительно статических членов и переходим на новый уровень абстракции - статические классы
Реальный пример из футбола, демонстрирующий сущность статических членов;
Потихоньку знакомимся с правилами создания кода в принципах ООП;
Варианты доступа к полям - напрямую и через методы доступа;
Приходим к пониманию целесообразности использования статических классов;
Определение статического класса;
Правила создания членов в статическом классе;
Какие конструкторы могут содержать статические классы;
Понимание ситуаций, когда выбрать обычный, а когда статический класс.
Урок 22 -Примеры статических классов
Продолжительность: 25 минут
В этом уроке мы продолжаем работать со статическими классами и их членами
Зачем закрывать доступ к статическому полю и как тогда его использовать?
Обобщаем и подытоживаем накопленные знания относительно динамических членов класса;
Вспоминаем принцип работы динамических полей и методов;
Осмысление назначения статических членов. Особенности определения статических полей;
Синтаксис доступа к статическим членам;
В чём главная особенность поведения статических членов;
Как организованы в памяти статические поля;
Главный вывод, который следует сделать по использованию статических классов - экономия памяти и повышение соответствия организации кода принципам ООП.
Урок 23 -Перечисления
Продолжительность: 33 минуты
В этом уроке мы с Вами переходим от статических полей до перечислений
Обзор перечислений с точки зрения типов .NET;
Разбираем заведомо ошибочный пример эмулирующий работу кнопки на вебстранице показывающий нюансы при работе с перечислениями;
Когда перечисления удобнее массива;
Определение перечисления. Синтаксис объявления и доступа к членам перечисления;
Так что же такое перечисление;
Полная свобода при определении членов в перечислении;
Правила создания членов в перечислении;
Раскрываем карты относительно классов;
Всем бояться циклических зависимостей;
Элементы наследования.
Урок 24 -Передача параметров по ссылке
Продолжительность: 21 минута
Очень важный урок. В нём мы узнаем о понятии ссылочной передачи в методы параметров значимых типов
Повторение теории об обычной передаче параметров значимых типов в методы;
Выяснение закулисных движений при передаче значений в метод. Принцип передачи переменных значимых типов;
Главный недостаток при обычной передаче в методы параметров;
Ключевое слово ref - передача параметров по ссылке - решение всех проблем;
Синтаксические особенности организации процесса передачи параметров по ссылке;
Рассмотрение данного процесса с точки зрения распределения переменных в памяти;
Потихоньку знакомимся с правилами создания кода в принципах ООП.
Урок 25 -Ключевое слово out
Продолжительность: 19 минут
В этом уроке мы познакомимся с ещё одним вариантом передачи параметров в метод
Для чего и когда имеет смысл передавать параметры с модификатором out;
Когда модификатор out является наилучшей альтернативой модификатору ref;
Основная выгода от использования модификатора out;
Знакомимся с отладочным механизмом - точки останова;
Вызов методов с входными параметрами при одновременным использованием модификаторов ref и out;
Урок 26 -Ключевое слово params
Продолжительность: 17 минут
В этом уроке мы познакомимся с ещё одним вариантом передачи параметров в метод params
Особенности передачи в метод на выполнение массива;
Для чего и когда имеет смысл передавать параметры с модификатором params;
Почему модификатор params является лучшим выбором по сравнению с передачей в метод массива;
Синтаксис указания модификатора params;
Поддержка вызова метода с переменным числом входных параметров;
Понимаем всю гибкость при передаче произвольного количества параметров данных в целевой метод.
Урок 27 -Структуры
Продолжительность: 20 минут
В этом уроке мы узнаем что такое структуры и когда использовать структуры предпочтительнее классов;
Зачем мы создаём пользовательские классы;
Определение структуры. Общий значимый тип. Особенности размещения структур в памяти;
Понимание структур на практическом примере;
Новый взгляд на оператор new. Что, значимые типы тоже имеют конструкторы? Всё есть объект;
Два варианта создания объекта некоторой пользовательской структуры.
Урок 28 -Структуры (продолжение)
Продолжительность: 14 минут
В этом уроке мы углубляем знания относительно создания и применения структур
Ограничение наследования структур;
Работа с конструкторами в структурах;
Почему для структур нельзя переопределять конструктор по умолчанию;
Важное отличие создание конструкторов у структур, которое Вы не найдёте в книгах;
Значимые и ссылочные типы. Кто кого и кто с кем?
Первое определение понятие сборщика мусора;
Определение моментов, когда целесообразно использовать структуры.
Урок 29 -Значимые и ссылочные типы - различия
Продолжительность: 23 минуты
В этом уроке мы разбираем правила, по которым происходит копирование данных значимых типов.
Проблемы при работе с объектами сборщика мусора;
Нахождение ключевых отличий при удалении значимых и ссылочных данных;
Циклы - лакмусовая бумажка для структур и классов;
Показательное присваивание значимых данных. Особенности в процессах присваивания.
Урок 30 -Значимые и ссылочные типы (продолжение)
Продолжительность: 22 минуты
В этом чрезвычайно важном уроке мы закрепляем знания по работе копирования классов. Пройдя данный урок, Вы раз и навсегда поймите принципы работы со ссылочными и со значимыми типами
Правила копирования структур;
Правила копирования классов;
Обобщение отличий в процессе копирования структур и классов;
Функция рефакторинга - быстрое переименовывание членов мгновенно;
Процесс копирования ссылочных переменных с позиций размещения в памяти;
Почему передача по значению ссылочных данных не работает так как для значимых типов?
Урок 31 -Значимые и ссылочные типы (продолжение)
Продолжительность: 11 минут
В этом уроке Вы окончательно запутаетесь
В чем разница при копировании одного ссылочного объекта в другой и копирования их внутренних членов;
Снова рисуем стек и управляемую кучу для понимания оператора присваивания;
Наконец-то полностью понимаем оператор "=";
Ещё раз останавливаемся на понятии полного квалифицированного имени переменной.
Урок 32 -Хранение ссылочной переменной в значимом типе
Продолжительность: 36 минут
В этом уроке мы рассмотрим все ключевые моменты, связанные с процессом хранения ссылочных типов в значимых типах и значимых типов в ссылочных типах
Рассматриваем пример создания ссылочного поля в пользовательской структуре;
Особенности копирования ссылочных полей структуры при копировании объекта структуры;
Понимание правил копирования структур, содержащих ссылочные поля.
Урок 33 -Передача ссылочных типов в методы
Продолжительность: 17 минут
В этом уроке мы подробно останавливаемся на процессе передачи ссылочных данных в методы на выполнение
Повторение процесса передачи в метод данных значимого типа;
Почему статический метод может работать не со статическими переменными? В чём подвох? Не обольщайтесь - всё дело в локальности переменной;
Выполняем передачу ссылочного типа. Что происходит?
Обобщение правил, по которым выполняется передача внутренних полей в метод при передаче объектных данных;
Почему передача по значению ссылочных данных не работает так, как для значимых типов?
Обобщение правил, по которым выполняется передача внутренних полей в метод при передаче объектных данных.
Урок 34 -Передача ссылочных типов в методы по ссылке
Продолжительность: 14 минут
В этом уроке мы разберём ещё один способ передачи ссылочных данных в методы
Что представляет из себя передача ссылочных данных в методы по ссылке?
Что следует учитывать при ссылочной передаче параметров в методы?
Главное ограничение обычной передачи ссылочных данных;
Главное отличие процесса передачи ссылочных данных по ссылке от процесса обычной передачи;
Определение моментов, когда целесообразно использовать структуры.
Урок 35 -Boxing/UnBoxing - понятие упаковки/распаковки
Продолжительность: 31 минута
В этом уроке мы разберём все вопросы преобразований типов
Какой ключевой момент следует учитывать при выполнении оператора "=";
Что во что конвертируется при присваивании - понятие неявного преобразования;
Когда допустимо неявное преобразование, условия успешного выполнения неявного преобразования;
Явное преобразование. Ключевые моменты и потеря данных;
Больший тип-меньший тип - направление преобразований;
Когда необходимо применять явное преобразование;
Особенности конвертации значимых типов в ссылочные - процесс упаковки (Boxing);
Что происходит со стеком при упаковке;
Снова работаем с типом Object;
Правила распаковки;
С чего начинается процесс распаковки и что необходимо проверять перед распаковкой переменной?
Понимаем, что распаковка - обычное явное приведение;
Сложные примеры составных приведений при распаковке и упаковке;
Примеры практических упаковок;
Наконец-то полностью понимаем оператор "=";
Тип object, - можно расслабиться в отношении с упаковкой в данный тип.
Урок 36 -Особенности упаковки/распаковки структур
Продолжительность: 16 минут
В этом уроке мы понимаем процесс упаковки структур и перечислений
Какие проблемы поджидают нас при выполнении упаковки структур;
Почему поля структур после упаковки становятся не доступными;
Необходимость обратной конвертации - провести распаковку;
Проверка допустимости обратной распаковки - вспомогательный оператор проверки исходного типа - "is".
Перейти к форме заказа
ООП И НЕСТАНДАРТНЫЕ ПОДХОДЫ
Меню раздела 3.
В этом разделе даются понятия объектно-ориентированно программирования. Вы узнаете о базовых концепциях, на которых и базируется мощнейший C#: полиморфизм, инкапсуляция и наследование.
До мельчайших подробностей разбираются все нюансы реализации ООП, а также попутно затрагиваются темы, которые так, или иначе связаны с подходами ООП.
В курс вошли 31 урок общей продолжительностью
11 часов и 37 минут.
Урок 1 - Понятие ООП, принципы
Продолжительность: 16 минуты
В этом уроке мы знакомимся с философией объектно-ориентированного программирования.
Какие существуют принципы ООП и почему следует так строго их придерживаться;
Понятие принципа инкапсуляции. Что от кого следует скрывать;
Понятие принципа наследования. Создание иерархий в отношении сущностей;
Понятие полиморфизма. Концепция, дающая широкие возможности;
Тип Object - простое объяснение механизмов наследования и полиморфизма.
Урок 2 -Инкапсуляция
Продолжительность: 43 минуты
В этом уроке мы подробно рассматриваем базовый принцип ООП- инкапсуляцию
Для чего следует скрывать внутреннюю реализацию того, или иного класса;
К каким фатальным последствиям может привести игнорирование концепции инкапсуляции;
Что дает инкапсуляция для разработчика и что дает для конечного пользователя;
Первый способ классической реализации инкапсуляции;
Главные недостатки данного способа;
Другой вариант реализации инкапсуляции - применение свойств;
Синтаксическая конструкция определения свойств;
Так что представляют из себя свойства - поля, или методы?
Главное достоинство свойств - невероятная гибкость в работе с оператором "=";
Важный нюанс при передаче свойств в методы в качестве входных параметров;
Манипулируем уровнем доступа внутренних функций полей;
Поля только для чтения и поля только для записи;
Статические свойства. Особенности определения и их использования;
Уловки перегрузки свойств.
Урок 3 -Наследование
Продолжительность: 29 минут
В этом уроке мы подробно рассматриваем еще один важный принцип ООП - наследование
Что означает для классов, участвующих в наследовании;
Когда следует применять наследование, а когда лучше отказаться от него;
Какие выгоды можно получить, применив наследование;
Знакомимся с понятием и синтаксическим выражением наследования;
Синтаксис применения наследования;
Понимаем нюансы по членам - кто кому принадлежит;
Множественно наследование, главное правило;
Особенности установки модификаторов видимости для членов участвующих в наследовании;
Закрепляем наследование на примере;
Ступенчатое наследование;
Правила инициализации наследуемых полей в наследованных классах;
Первое столкновение с понятием полиморфизма - механизмом трактовки нескольких объектов одним образом;
Последние нюансы в понимании наследования - больше нет вопросов.
Урок 4 -Ключевое слово base
Продолжительность: 18 минут
Расширяем наше понимание процесса наследования с использованием оператора base
Рассматривается особенность вызова конструкторов при создании объекта класса-наследника и наследуемого класса;
Зачем и для чего вызывается конструктор базового класса;
Ручное использование вызова конструктора базового класса;
Синтаксис вызова конструктора базового класса - оператор base;
Отличие применения оператора this от base при работе с конструкторами;
Использование базового конструктора в данном - перекладывание ответственности.
Урок 5 -Включение/делегирование
Продолжительность: 18 минут
Рассмотриваем другой вариант механизма наследования - включение в данном классе иного
Пример отношения "имеет" на примере;
При каких формах отношения классов следует трактовать данное отношение как "имеет";
Почему классическое наследование "является" не всегда подходит для некоторых ситуаций отношений;
Как выполнить делегирование;
Зачем сохранять принцип инкапсуляции при выполнении делегирования.
Урок 6 -Вложенные типы
Продолжительность: 9 минут
В данном уроке мы узнаем о вложенных типах и узнаем в каких ситуациях полезно создавать вложенные типы
Зачем создавать вложенные типы;
Область видимости вложенных типов;
Особенности доступа к вложенным типам из вне класса;
Внешний класс - подобие пространства имён;
Зачем закрывать вложенный тип и создавать его объект только внутри внешнего класса;
Ключевые моменты для использования вложенного типа - закрыт для внешнего мира и реализует собой отдельную логику;
Опять сохраняем инкапсуляцию?!
Почему следует избегать использования вложенных типов.
Урок 7 -Полиморфизм
Продолжительность: 30 минут
В этом уроке изучаем последний обширный и многогранный принцип - полиморфизм
Понятие полиморфизма;
Полиморфизм - механизм трактовки нескольких объектов одним образом;
Полиморфизм - ещё один взгляд на тип object;
Создание иерархии наследования классов геометрических фигур для создания фундамента правильного понимания выгод полиморфизма;
В чём главная проблема использования наследования без соблюдения полиморфизма;
Проблемы решения проблем простого наследования
"в лоб" - выход в полиморфизме;
Приходим к пониманию понятия переопределения;
Какие методы и в каких классах следует переопределять;
Ключевые слова virtual и ovveride;
Все тонкости применения модификаторов virtual и ovveride;
Ещё одно назначение оператора base для вызова реализации методов базового класса;
Играем операторами this, base, virtual и ovveride на полную катушку;
Главная выгода написание кода в принципах полиморфизма;
Понимаем, что только одновременное связывание всех столпов ООП - залог создания отличной архитектуры;
Правила именования перекрываемых методов;
Почему модификатор virtual не может совместно применяться с модификаторами public, static, override, abstract.
Урок 8 -Операторы is и as
Продолжительность: 20 минут
Практическое применение принципа наследования на примерах применения операторов приведения
При каких условиях возможно успешно передать параметр в вызываемый метод;
Вспоминаем назначение оператора is;
В переменной типа object размещаем объект любого типа;
Boxing/unboxing, наследование и полиморфизм - разная трактовка одного механизма?!
Ещё раз рассмотрение примеров неявного преобразования типов;
Главная задача, которую накладывают на принцип наследования;
Супер возможность хранения объекта класса-наследника в ссылке типа базового класса;
Собрать всех наследников в одном массиве типа базового класса - отличная идея;
Демонстрация всех прелестей проявления полиморфизма при применении наследования на примере быстрого перебора объектов разных классов в одном цикле;
Один метод, один принимаемый параметр - передаем разные типы с лёгкостью, - заслуга полиморфизма с наследованием.
Урок 9 -Операторы is и as (продолжение)
Продолжительность: 20 минут
В этом уроке мы с Вами продолжаем углублятся в нюансы работы с принципами ООП
От метода ToString не скроешь настоящее происхождение типа;
Следует понять, какой же все-таки тип мы имеем, запутаться раз плюнуть;
Что же делает с типами оператор "=";
Сплошная "Санта Барбара" с наследованием;
Друг твоего друга - твой друг;
Ещё один тип ситуаций, требующий явного приведения типов;
Примеры использования оператора as при проверке получение целевого типа из переданного в метод параметра.
Урок 10 -
Перекрытие членов. Оператор new
Продолжительность: 16 минут
В этом уроке мы узнаем о необходимости скрытия некоторых членов базового класса и познакомимся с возможными вариантами достижения этого
Возможные случаи неумышленного скрытия членов базового класса;
Более пристальный взгляд на ситуации скрытия;
Почему не всегда допустимо решать ситуацию скрытия перекрытием, используя модификатор virtual в базовом классе?
Как правильно скрыть одноименный метод родительского класса? Ключевое слово new в определении методов;
Как оператор new применять для полей?
Как с помощью операции приведения вызывать скрытый член базового класса через указание имени члена класса-наследника;
Важная деталь вызова скрытого члена базового класса через вызов одноименного члена класса-наследника.
Урок 11 -Абстрактные классы и их члены
Продолжительность: 23 минуты
В этом уроке мы познакомимся с абстрактными классами и абстрактными членами
Когда недопустимо иметь возможность создания объекта некоторого класса;
Что представляют из себя чересчур общие классы;
Запрет на создание экземпляра класса - объявить его конструкторы закрытыми - private;
Почему решение вышеуказанной проблемы через закрытие доступа к конструкторам класса не является допустимым при ситуации когда данный класс есть наследуемым?
Почему использование модификатора доступа protected вместо private для конструктора базового класса является устаревшим решением проблемы?
Иной вариант - объявление класса абстрактным;
Функции, которые несет на себе наследуемый абстрактный класс;
Могут ли в абстрактном классе быть определены виртуальные методы?
Для чего существуют абстрактные методы?
Почему абстрактные методы могут быть описаны только в абстрактных классах;
Какого типа члены может содержать в себе абстрактный класс, а какого типа не может?
Правильное определение абстрактного метода;
О чём следует всегда помнить при создании классов, наследующих базовый абстрактный класс;
Какая связь существует между ключевыми словами virual, abstract и override?
Использование абстрактных классов - неплохой вариант следования полиморфизму - в переменной типа абстрактного класса содержим объекты производных классов.
Урок 12 -Запечатанные классы
Продолжительность: 8 минут
В этом уроке мы узнаем для чего иногда запечатывают классы и как это происходит
Иерархия наследования - последние штрихи;
Закрытие возможности перегрузки метода в базовом классе его наследниками, используя модификатор sealed;
Sealed -предотвращение наследования некоторых методов наследуемого класса;
Конечные - ненаследуемые классы, - запечатанные классы;
Так к чему применять ключевое слово sealed.
Урок 13 -Интерфейсы
Продолжительность: 25 минут
В этом уроке мы узнаем о самой главной альтернативой использования абстрактных классов - интерфейсами
Интерфейсы - лучшая альтернатива абстрактным классам - решение проблемы множественного наследования;
Интерфейс - групповой набор абстрактных членов;
Синтаксис создания интерфейсов;
Правила именования интерфейсов;
Особенности определения членов интерфейсов;
Правила определения свойств интерфейса;
Правила определения методов интерфейса;
Пример реализации интерфейса классом;
Множественное наследование интерфейсов;
Главное правило описания одновременного наследованния класса и интерфейсов.
Урок 14 -Примеры применения интерфейсов
Продолжительность: 29 минут
В этом уроке мы поработаем с интерфейсами и абстрактными классами на заковыристых примерах
Снова работаем с вкладкой ClassView;
Как вывести диаграмму распределения классов и интерфейсов Вашего проекта, а также связей в которых они участвуют между собой. Как правильно читать данный рисунок;
Возможность хранения объекта класса в ссылке типа одной из наследуемых сущностей - неимоверная гибкость;
Важное ограничение при доступе к членам соответствующего класса при способе хранения объекта, описанного выше;
Работа с методом, принимающий параметр типа интерфейса;
Широкие возможности при конвертации типов во время вызова методов.
Урок 15 -Применение интерфейсов (продолжение)
Продолжительность: 32 минуты
В данном уроке мы продолжаем исследовать особенности работы с интерфейсами на практических примерах. Исследуем все возможные варианты приведения типов и конвертации
Пример использования оператора as;
Создаём метод, принимающий один тип и возвращающий другой тип - конвертер типов - отличная идея для избавления от кода проверки возможности конвертации;
Оператор as снова втрое сэкономил много кода;
Исследование возможности хранения данного типа в некоторых иных по визуальной диаграмме иерархии классов и интерфейсов;
Ещё раз о явной и неявной конвертации при вызове методов;
Правило "мостика", род типа.
Урок 16 -Наследование в интерфейсах
Продолжительность: 14 минут
В этом уроке мы разберём механизм наследования интерфейсами интерфейсов
Использование смарт-тегов;
Создаем пример для понимания возможности ситуаций для выполнения интерфейсной наследственности;
Для чего может понадобиться наследование интерфейсом интерфейсов;
Демонстрация иерархии наследования в интерфейсах на визуальной диаграмме.
Урок 17 -Явная реализация интерфейсов
Продолжительность: 18 минут
В этом уроке мы с Вами продолжим работу с интерфейсной наследственностью и узнаем о понятии явной реализации членов интерфейсов
Зачем может понадобиться явная реализация интерфейса;
В каких случаях не следует явно реализовывать интерфейсы;
Какие ограничения накладываются на члены интерфейсов реализованных явно;
Синтаксис явной реализации членов интерфейсов, особенности использования модификаторов доступа;
Выборочная типизация - вызов метода возможен не на уровне объекта, а лишь на уровне интерфейса;
Приведение типов - способ вызова явно реализованного члена;
Явная реализация - управление доступом (видимостью) члена через тип;
Что во что можно конвертировать - анализируем не тип ссылки, а тип объекта. Ключ к пониманию правил конвертации - тип объекта;
Правило реализации одноимённых методов интерфейсов в одном классе - скрытый конфликт имён;
Решение конфликта имён в явной реализации интерфейсов.
Урок 18 -Переопределение метода Equals
Продолжительность: 35 минут
Из этого урока Вы узнаете, зачем может понадобиться перекрытие методов и как это сделать для метода Object.Equals
Исследование типа Object через вкладку Object Browser;
Исследование всех методов класса Object;
Определение методов, готовых к переопределению;
Показательный пример необходимости сравнивания двух объектов;
Сравниваем ссылки, используя статический метод Object.Equals - вариации сравнения;
Так что же мы сравниваем;
Другой метод сравнения объектов - динамический Equals;
Обычные этапы для формирования правильной логики сравнения объектов в теле метода.
Урок 19 -Методы ToString и GetHushCode
Продолжительность: 20 минут
В данном уроке речь пойдет о переопределении методов ToString и GetHushCode
Как метод ToString работает по умолчанию;
Модель переопределения метода ToString;
Почему надо стараться всегда перекрывать метод ToString;
Как переопределенный метод ToString поможет переопределить метод Equals;
Почему вылетает сообщение о не переопределении метода GetHushCode при переопределенном методе Equals?
Для чего существует метод GetHushCode и когда он используется?
Демонстрация работы метода GetHushCode;
Как теперь быстро и точно переопределить метод GetHushCode;
Понимаем взаимосвязь переопределений базовых методов типа Object;
Отличие в работе методов Object.Equals и Object.ReferenceEquals.
Урок 20 -Клонирование классов, структур
Продолжительность: 31 минута
В этом уроке мы займемся процессом клонирования классов и структур. Узнаем что это такое
Когда может понадобиться создание полной копии объекта;
Ключевые моменты копирования объектов через оператор "=";
Вспоминаем отличие копирования значимых и ссылочных типов через оператор "=";
Необходимость копировать ссылочный тип как значимый;
Интерфейс IClonable. Необходимость его реализации для создания клонируемого типа;
Главная проблема метода Clone - тип возвращаемого значения;
Важный нюанс который следует учесть при реализации метода Clone;
Правильная реализация метода Clone;
Учитываем особенности копирования ссылочных полей при клонировании.
Урок 21 -Создание сравниваемых объектов
Продолжительность: 17 минут
В этом уроке мы с Вами займёмся организацией процесса для автоматического выполнения сравнивания объектов
Реальный пример из жизни разработчика демонстрирующий необходимость сравнивания объектов;
Проблема сортировки массива пользовательского типа;
Что происходит с элементами массива при попытке его сортировки. Какие операции при этом вызываются;
Интерфейс IComparable. Кто и когда вызывает метод CompareTo;
Правило определения возвращения значения из метода CompareTo;
Определяем алгоритм для сравнивания строковых значений.
Урок 22 -Сравниваемые объекты (продолжение)
Продолжительность: 20 минут
В этом уроке мы с Вами закончим реализацию метода сравнения имен студентов
Избегаем сложных реализаций метода CompareTo, изложенных в книгах, и реализовываем
всё самыми простыми приемами.
Урок 23 -Коллекции. ArrayList
Продолжительность: 32 минуты
Здесь мы с Вами познакомимся с коллекциями и поработаем с типом ArrayList
Разбираем на примере главный недостаток обычных массивов - их размерность;
Обычные массивы - чрезмерный перерасход памяти, вероятность не достатка размерности;
Знакомимся с пространством имен System.Collection;
Что представляют из себя "резиновые" коллекции ArrayList, Hashtable, Queue, Stack, SortedLis;t
Какие удобства мы можем извлечь применяя определенный класс пространства System.Collection;
Самый ходовой класс - класс ArrayList. Создание коллекции ArrayList, добавление элементов и доступ к ним;
Отличие свойства Count и Capasity. Принцип увеличения значений этих свойств;
Как заносить в динамический массив сразу все элементы из обычного массива;
Вставляем любой элемент в любое место легко;
Как быстро преобразовать коллекцию в обычный массив используя оператор typeof и операцию приведения.
Урок 24 -Обработка исключительных ситуаций
Продолжительность: 25 минут
Здесь мы поговорим о возможных типах ошибок и инструментах их вылова и обработки
Какие типы ошибок могут возникать в процессе разработки;
Баг. Определение;
Пользовательские ошибки;
Исключения - аномалии времени выполнения - самые неприятные ошибки;
Главная задача приложения это устоять и продолжить нормальный режим работы после возникновения исключительной ситуации;
Конструкция try-catch-finally для вылова и обработки возможных исключительных ситуаций;
Эффективное использования блока finaly;
Обзор типов исключений задекларированных в .NET;
Несколько блоков catch с одним блоком try. Зачем это нужно? Принцип работы;
Передача в блок catch параметра типа исключения.
Урок 25 -Обработка исключений (продолжение)
Продолжительность: 17 минут
В этом уроке мы с Вами продолжим изучать принципы работы с исключениями
Получение информации о методе (месте) возникновения исключительной ситуации;
Определение последовательности вызовов приведших к исключению, интерпретация полученной информации;
Указание источника информации для решения возникшей исключительной ситуации;
Ручная генерация пользовательских исключений - когда это бывает необходимо;
Синтаксис генерирования исключительной ситуации;
Выбор какого типа следует создавать объект исключения для передачи в соответствующий блок catch;
Как настроить свойства пользовательского исключения;
Что происходит, если генерируя пользовательское исключение, мы не передаем ни один объект класса исключения;
Когда все-таки бывает удобно получать более узконаправленную информацию об исключении.
Урок 26 -Пользовательские индексаторы
Продолжительность: 17 минут
В этом уроке мы научимся создавать пользовательские индексаторы
Для чего бывает необходимо создавать пользовательские индексаторы;
В чём удобство от использования пользовательских индексаторов;
Создание объектной модели сулящей эффективному использованию пользовательского индексатора;
Демонстрация жуткого неудобства при работе с массивами и списками пользовательского типа как с полем некоторого класса;
Понятие индексатора. Синтаксис создания пользовательских индексаторов;
Какие шаги следует выполнить и соблюсти условия для правильного создания индексатора;
Какой тип может подойти для выступления в роли контейнера индексатора.
Урок 27 -Индексаторы (продолжение)
Продолжительность: 18 минут
Здесь мы завершаем работу по созданию и использованию пользовательских индексаторов.
Как использовать созданный индексатор для заполнения объекта-индексатора данными;
Почему индексатор по умолчанию не определяет свойство Length;
Определяем свойство Length самостоятельно;
Почему пользовательский индексатор не может работать с циклом foreach. Интерфейс IEnumerator;
Как цикл foreach работает с методом GetEnumerator?
Реализовываем метод GetEnumerator;
Использование оператора yield.
Урок 28 -Перегрузка операторов
Продолжительность: 25 минут
Из этого урока мы узнаем для чего, как и зачем перегружать операторы
Пример закулисной перегрузки оператора "+" для целочисленных типов и для типа string;
Зачем перегружать операторы, что это даёт;
Синтаксис определения перегрузки математических операторов;
Что следует помнить при перегрузке операторов;
Один и тот же оператор работает по-разному для разных типов, если тот перегружен;
Пример перегрузки инкремента и декремента;
Бинарные и унарные операторы - в чем отличие механизма перегрузки;
Когда следует перегружать оператор "==";
Взаимосвязь перегруженного оператора "==" и перегруженного метода Equals;
При перегрузке оператора "==" обязательно следует перегрузить оператор "!=".
Урок 29 -
Примеры перегрузки операторов
Продолжительность: 27 минут
В этом уроке мы с Вами разработаем приложение которое перемножает матрицы. Для этой цели мы перегрузим оператор
"*"
Создаем предлог для перегрузки оператора * - создаем класс Matrix, все необходимые поля и свойства для них, а также пользовательский двумерный индексатор;
Уточнение правил математического умножения матриц - определений условий для успешного выполнения произведения;
Совершенствуем существующую формулу перемножения матриц;
Переписываем полученную формулу на языке тройных циклов;
Более пристальный взгляд на тройной цикл на примере рассмотрения механических часов.
Урок 30 -Ещё примеры перегрузок
Продолжительность: 26 минут
Здесь мы продолжаем разработку универсального перемножителя матриц
Создаем пользовательский интерфейс запроса данных у пользователя, используя пустой цикл for;
Добавляем код вылавливания и обработки ошибок;
Работаем с генератором псевдослучайных чисел - классом Random.
Урок 31 -Ещё примеры перегрузок (продолжение)
Продолжительность: 20 минут
В этом последнем для данного раздела уроке мы заканчиваем с переумножителем матриц
Выводим содержимое матриц, используя флаги форматирования;
Создаем заготовку перегружаемого оператора "*";
Определяем логику операции перемножения матриц и проверяем полученные результаты;
Отклоняемся от главной темы и определяем, как же следует изучать новый материал.
Перейти к форме заказа
РЕФЛЕКСИЯ И МНОГОПОТОЧНОСТЬ
Меню раздела 4.
В этом разделе мы познакомимся с инструментами языка C#, позволяющими быстро и точно создавать полнофункциональные приложения любого уровня использования и сложности архитектуры.
Здесь мы разберем такие понятия как рефлексия (отражение), сборки, делегаты и события, обобщения и потоки... Данный раздел не для слабонервных.
В курс вошли 19 уроков общей продолжительностью
8 часов 36 минут.
Урок 1 -
Отражение (рефлексия)
Продолжительность: 22 минуты
В этом уроке мы с Вами рассмотрим понятие рефлексии и выясним, когда она применяется
Понятие рефлексии
В каком пространстве имен находятся типы для работы с рефлексией;
Базовый класс System.Type - получение ссылки на тип, а не объект типа;
Пример создания ссылки на тип;
Рассмотрение классов связанных с рефлексией;
Понятие метаданных. Зачем они формируются, кем и когда. Связь метаданных и рефлексии;
Пример использования класса Type. Оператор typeof;
Главное отличие оператора typeof и динамического метода Get.Type;
Получение ссылки на тип методом Type.GetType. В каком представлении следует указывать тип параметра данного метода?
Достаем всю необходимую информацию о пользовательском типе;
Понятие о позднем связывании.
Урок 2 -Отражение (рефлексия) (продолжение)
Продолжительность: 28 минут
В этом уроке пойдет речь о способах вытягивания информации о типе - метаданных класса
Получаем имена полей исследуемого класса;
Получаем имена свойств класса;
Получаем имена методов и разбираемся в полученных результатах - почему присутствуют get и set функции свойств?
Отличительные особенности получение информации о типе-интерфейсе;
В каком пространстве имен находятся типы для работы с рефлексией;
Работаем с коллекцией SortedList: проверяем класс - абстрактный, или - нет, ссылочный тип, или - значимый тип, определяем базовый тип;
Заключаем, что с помощью рефлексии мы имеем возможность поднимать метаданные;
Понятие сборки, подключаемые модули на примере добавления утилит в текстовый редактор Microsoft Word - наглядное применение рефлексии.
Урок 3 -Позднее связывание. Создание библиотек -.dll
Продолжительность: 25 минут
В этом уроке мы с Вами создадим заготовку примера расширяемого приложения
Позднее связывание - лучшее применение рефлексии;
Объяснение понятия позднего связывания на примере автомобиля;
Яблоки - лучший пример позднего связывания - преимущества и недостатки применения позднего связывания;
Простой пример раннего связывания;
Что представляют из себя библиотеки классов;
Как подключать библиотеку кода - сборку;
Что происходит внутри приложения при подключении новой сборки;
Создаем и добавляем в проект новую библиотеку кода;
Как в проекте добавить ссылку на библиотеку кода;
Пример позднего связывания.
Урок 4 -Пример использования позднего связывания
Продолжительность: 37 минут
В этом уроке мы завершаем разработку расширяемого приложения, в котором возможна доустановка дополнительных компонент
Использование класса, которого еще не существует;
Знакомимся с классом Assembly. Метод загрузки сборок Load;
Правила именования констант;
Предусматриваем ситуации не нахождения сборки, класса сборки, или члена класса сборки;
Отлавливаем собственно генерируемую исключительную ситуацию;
Необходимый альянс из типа Object, класса Activator и его метода CreateInstance;
Знакомимся с пресловутым методом Invoke для вызова целевого метода;
Понимание основ, необходимых для правильного использования метода Invoke;
Создание массива параметров для передачи в метод Invoke.
Урок 5 -Обход запрета на вызов запретных методов
Продолжительность: 8 минут
В этом уроке мы с Вами разберём технологию, позволяющую вызывать закрытые методы, используя рефлексию
Первый шаг - получение метаданных класса, содержащего целевой метод;
Шаг второй - получение метаданных целевого метода. Нюанс при указании составного входного параметра - флага для метода GetMethod;
Почему данный урок я не хотел выносить на DVD-диск?
Урок 6 -Обобщения. Обобщенные списки
Продолжительность: 22 минуты
В этом уроке мы узнаем об обобщенных коллекциях. Разберём, зачем они существуют и когда их следует использовать
Почему замена обычных массивов списками типа ArrayList зачастую несет дополнительные системные расходы;
Упаковка/распаковка - обычная операция при работе со списками и причём тут сборка мусора;
Обобщения. Понятие. Синтаксическое определение. Пространство имён System.Collection.Generic;
List - лучшая замена обычного ArrayList;
Отсутствие упаковки/распаковки и полный контроль типов на этапе разработки - главные преимущества обобщенных списков;
Пример создания обобщенного списка с пользовательским типом;
Проводится обзор обобщенных классов из пространства System.Collection.Generic и сравнение с их эквивалентами из пространства System.Collection.
Урок 7 -Обобщенные методы
Продолжительность: 17 минут
В этом уроке мы познакомимся с обобщенными методами и выясним некоторые очень интересные нюансы относительно этого
Когда могут понадобиться обобщенные методы;
Синтаксис определения обобщенного метода;
Что использовать: перегрузку метода, или его обобщенный вариант;
Пример создания и вызова обобщенного метода с разного типа параметрами;
Особенности вызова обобщенного метода без входных параметров;
О каких ключевых моментах следует помнить, используя обобщенные методы.
Урок 8 -Обобщенные интерфейсы, классы
Продолжительность: 24 минуты
В этом уроке Вы научитесь работать с обобщенными интерфейсами и классами, а также с их внутренними обобщенными членами
Пример создания обобщенного интерфейса с описанием внутри нескольких обобщенных методов;
Синтаксические особенности указания реализуемого интерфейса некоторым классом;
Какие же преимущества имеет обобщенный интерфейс - главное - отсутствие строгой привязки к типам;
Принципы создания обобщенных классов и обобщенных его членов.
Объявление обобщенных конструкторов
Объявление обобщенной ссылки и задание для неё обобщенного экземпляра
Примеры создания экземпляров обобщенного типа, используя различные перегрузки конструктора, включая перегрузку без параметров
Особенности вызова конструктора по умолчанию для обобщенного класса настроенного на пользовательский тип;
Смысл применения ключевого слова default для установки полей пользовательского типа.
Урок 9 -Указание ограничений в обобщенных типах
Продолжительность: 24 минуты
Здесь мы выясним ключевые моменты относительно указания ограничений и шаблонов для пользовательских типов
Определяем ограничения, которые ждут нас при использовании обобщенных классов;
Сложный пример создания
экземпляра обобщенного типа настроенного на пользовательский тип-наследник;
Какие проблемы возникают при настройке обобщенного класса на пользовательский тип;
Оператор where. Как применить, когда и что он дает;
Варианты использования оператора where;
Правила указания нескольких ограничений и условий;
Примеры накладывания ограничений на обобщенные методы.
Урок 10 -Делегаты
Продолжительность: 39 минут
В этом уроке мы начнем изучение делегатов и познакомимся с особенностями их использования
Понятие делегата. Необходимость использования делегатов;
Синтаксис определения типа-делегата;
Какой объект следует создавать, что б использовать тип-делегат? Понимание делегатов как типа и как объекта;
Особенности указания целевого метода в качестве параметра объекта-делегата;
Синтаксис вызова целевого метода через делегат;
Примеры вызова динамических, статических методов, методов с входными параметрами и входными параметрами по ссылке;
Пример создания делегата для вызова метода с пользовательскими типами;
Понятие ковариантности делегатов. Пример использования ковариантности делегатов;
Очень важна особенность ковариантности делегатов, связанная с принципом наследования и условий явной конвертации типов.
Урок 11 -Групповые делегаты. Делегаты-параметры
Продолжительность: 10 минут
В этом уроке мы закончим с делегатами и рассмотрим групповые делегаты
Множественный вызов методов - прерогатива группового делегата;
Как зарегистрировать в делегате несколько методов для вызова?
Как снимать с регистрации метод?
Пример передачи в метод делегата в качестве входного параметра.
Урок 12 -События
Продолжительность: 37 минут
В этом уроке мы разберем механизм создания и использования событий
Жизненный пример происхождения событий;
Три обязательных шага необходимых для создания события;
Пример с насморком - понимаем природу событий;
Создаем пример - эмулятор рабочей кнопки;
Правило именования событий;
Что означает обработчик события;
Как подписаться на событие конкретным методом?
Понимаем, что событие - это делегат;
Создаем возможность запускать событие;
Синтаксис запуска события;
Какое обязательное условие следует проверять перед запуском события?
Возможно ли вызывать обработчик события вручную без генерации события?
Какие удобства нам дает использование событий?
Урок 13 -Примеры использования событий
Продолжительность: 25 минут
В этом уроке мы поработаем с практическими примерами по работе с событиями
Варианты размещения в разных классах обработчиков событий;
Регистрация на событие нескольких обработчиков события;
Отличительная особенность снятия метода с регистрации;
Статические и динамические обработчики событий. Различия в определении и декларировании.
Какие классы в лице методов могут уведомляться о наступлении события?
Практический пример реагирования приложения на действия пользователя используя событийный аппарат;
Разбиваем логику приложения инкапсулируя по классам;
Разработка циклов для ввода текста и для определения момента его печати.
Урок 14 -Примеры использования событий (продолжение)
Продолжительность: 24 минуты
В этом уроке мы полностью закрепляем навыки по созданию и использованию пользовательских событий
Выявляем баги и стараемся их пофиксить;
Регистрация на встроенное событие класса Console - Console.CancelKeyPress;
Исследование входных параметров обработчика .NET-события;
Подписываемся на встроенное событие закрытия окна консоли и выполняем обработку этого события звуковым сигналом;
Откуда черпается информация о происшедшем событии?
От чего негативного избавляют нас события.
Урок 15 -Введение в многопоточность
Продолжительность: 28 минут
В этом уроке мы знакомимся с понятием многопоточности и самого потока
Приложение и поток для него;
Пример работы многопоточного windows;
Многопоточность на примере мясорубки;
Преимущества, которые дают потоки;
Почему потоки следует использовать не всегда;
Когда же все-таки следует использовать многопоточность;
Почему многопоточность не дает выигрыш в производительности, а тем более в скорости работы приложения?
Раскрытие глаз относительно параллельнсти выполнения одновременно запущенных потоков?
Потоки не дают параллельнсти, так что же они дают?
Потоки выполняют методы, потоки не соотносятся с объектами, а соотносятся с методами;
Проблемы доступа к переменным из разных потоков;
Варианты и причины завершения работы потока;
Что такое домен приложения. Домены и потоки;
Прекрасная демонстрация принципа многопоточности на примере способа ношения сумок пожилыми людьми.
Урок 16 -Потоки (продолжение)
Продолжительность: 32 минуты
В этом уроке мы продолжим изучение потоков и остановимся на ключевых моментах в
работе многопоточности
В каком пространстве имен содержатся необходимые для работы с потоками классы;
Синтаксическая конструкция создания потока;
Какая связь существует между делегатами и потоками;
Как запустить поток на выполнение?
Понятие главного потока;
Упрощенная конструкция создания потока;
Ещё более простая конструкция объявления делегата;
В каком именно месте и когда же происходит старт потока;
Понятие анонимного метода. Зачем создаются анонимные методы
Синтаксические особенности указания анонимного метода;
Правила создания анонимных методов;
Демонстрация преимуществ многопоточности на примере одновременного выполнения двух циклов в разных потоках;
Наблюдаем такты переключения между потоками. Проблемы обычного выполнения множества потоков;
Демонстрация особенностей в работе с локальными переменными из одного и того же метода, запущенного в разных потоках;
Демонстрация особенностей в работе со статическими классовыми полями из одного и того же метода, запущенного в разных потоках;
Демонстрация особенностей в работе с динамическими (объектными) полями из одного и того же метода, запущенного в разных потоках;
Демонстрация ключевой особенности в одновременной работе нескольких потоков с одним полем когда, имея фактически одни результаты, видим совершенно иные.
Урок 17 -Потоки (продолжение)
Продолжительность: 34 минуты
В этом уроке мы продолжаем разбираться с многопоточностью и разбираем способы синхронизации и приостановки выполнения потоков
Так почему же мы получили неожидаемые результаты - все дело в псевдопараллельности;
Оператор lock для синхронизации потоков;
Важное обстоятельство при применении параметра для оператора lock;
Как использовать конструкцию lock для статических методов?
Еще один способ синхронизации - использование класса Monitor;
Альянс методов Monitor.Exit, Monitor.Enter и блоков try-catch;
Ещё один вариант синхронизации - метод Join. Принцип работы метода Join;
Ещё способ синхронизации - добавление к классу атрибута Synchronization;
Наследуемый класс ContextBoundObject
Что следует учитывать прежде чем решиться на синхронизацию классовых членов применив атрибут?
Как вручную приостанавливать выполнение потока. Зачем и где может понадобиться приостановка потока;
Пример, демонстрирующий периодическую приостановку выполнения потока;
Еще примеры по периодичности выполнения нескольких потоков с применением метода Thread.Sleep;
Выставление приоритетности выполнения конкретного потока по отношению к остальным запущенным;
Урок 18 -Потоки (продолжение)
Продолжительность: 31 минута
В этом уроке на многочисленных примерах мы закрепляем знания о многопоточности
Потоки переднего плана и фоновые потоки;
Отличие потоков переднего плана и фоновых потоков. Основная причина зависания приложений;
Какие операции помещают в фоновые потоки, а какие в потоки переднего плана;
Демонстрация отличительных особенностей работы фоновых потоков на практическом примере. Создание фонового потока;
Использование свойства IsBackground. Понимание моментального закрытия приложения сразу после его запуска;
Какой делегат следует использовать для вызова в отдельном потоке метода с входными параметрами?
Какого типа должен быть входной параметр для метода, вызываемого в отдельном потоке?
Каким образом передавать несколько параметров в такой метод?
Создание примера, демонстрирующего все нюансы при работе с методом, принимающего входные параметры и вызываемого в новом потоке;
Почему в качестве входного параметра лучше использовать классовый объект?
Урок 19 -Обзор вопросов
Продолжительность: 50 минут
В этом уроке мы подводим итоги относительно полученных знаний, а также проводим разбор типичных вопросов, которые задаются на собеседованиях при принятии на работу программистов. К уроку прилагается pdf-сборник данных вопросов и ответов на них
Длительный разбор тестовых вопросов и заданий, которые обычно задаются на собеседованиях.
Перейти к форме заказа
ОСНОВЫ РАБОТЫ С ФОРМАМИ
Меню раздела 5.
В этом разделе мы наконец-то создадим свое первое WinForms-приложение. Поработаем с формами и их контролами. Особенно остановим свое внимание на способах кросспоточной работы в WinForms-приложениях.
В курс вошли 16 уроков общей продолжительностью
5 часов и 10 минут.
Урок 1-Введение в Windows Forms. Понятие формы
Продолжительность: 13 минута
В этом уроке мы поговорим о том, как устроены множество всевозможных приложений с точки зрения программной логики
Понятие форм и окон и принципов работы с ними на примере нескольких реальных приложений (Microsoft Word);
Действия - события. Примеры работы действий-событий и действий-реагирования;
Модальные и немодальные окна. Отличия. Пример модальных и немодальных окон в программе Microsoft Word.
Урок 2 -Первая форма
Продолжительность: 17 минут
В данном уроке мы создаем свое первое оконное (Windows Forms) приложение.
Как создать проект Windows Forms application;
Обзор файловой структуры проекта и классовой структуры проекта - вкладки Solution Explorer и Class View;
Особое внимание уделяем вкладке Properties;
Вкладка инструментов и контролов Toolbox;
Добавление контрола на форму на примере кнопки;
Принцип создания контрола на форме с точки зрения кода;
Обзор категорий контролов;
Варианты открытия файла с кодом. Анализ данного файла;
Гвоздь программы - класс Form;
Знакомимся с модификатором partial. Анализ файла, отвечающего за программный код визуализации формы.
Урок 3 -Первая форма (продолжение)
Продолжительность: 18 минут
В этом уроке мы детально рассмотрим все классы участвующие в работе оконного приложения
Зачем один класс разбит на два файла;
Детальный разбор содержимого данных файлов;
Варианты настройки свойств контролов и окна;
Что представляет из себя класс Form?
Где находится точка входа в приложение. Разбор назначения атрибута STAThread;
Место создания и запуска формы;
Время создания формы и время запуска формы на отображение на экране;
Метафора "Большой взрыв".
Урок 4 -Добавление кнопки на форму
Продолжительность: 22 минуты
В этом уроке мы поиграем с настройками некоторых контролов: их свойствами и их событиями
Какой код добавляется в файл дизайнера при добавлении на форму контрола;
Варианты переименования контрола;
Правила именования контролов;
Порядок создания контролов при создании главной формы;
Дочерние (вложенные) и родительские контролы. Как добавить дочерний контрол на данный;
Получение списка дочерних контролов для данного контрола;
Добавляем еще одну кнопку и настраиваем их внешний вид;
Интересное свойство TabIndex;
Событие по умолчанию для каждого контрола;
Подписываемся на событие загрузки главного окна. Работаем с данным событием;
Способ мгновенного подписывания на событие по умолчанию для данного контрола;
Детальный разбор сигнатуры обработчиков событий;
В обработчике события деактивируем/активируем вторую кнопку через установку свойства Enabled;
Работаем с событиями кнопки через вкладку Properties.
Урок 5 -Добавление кнопки на форму (продолжение)
Продолжительность: 22 минуты
В этом уроке мы продолжаем экспериментировать с событиями некоторых контролов
Нюансы принудительного изменения размеров контрола. класс Size;
Выводим на экран новое окно с сообщением о нажатой кнопке мыши;
Используем входной параметр для определения, какая именно кнопка была нажата;;
Работаем с событиями закрытия приложения. Запрашиваем у пользователя подтверждения желания закрытия приложения;
Какие параметры следует дать методу MesageBox.Show для правильного создания диалогового окна;
Как определить, что решил пользователь относительно закрытия приложения.
Урок 6 -Добавление других контролов
Продолжительность: 17 минут
В этом уроке мы добавим на форму еще несколько других контролов и поиграем с их взаимосвязями
Устраняем баги из прошлого примера;
Детальное рассмотрение свойства Controls;
Как и с помощью какого класса возможна одновременная работа сразу со всеми дочерними контролами для данного контрола
Демонстрация работы с контролом Panel. Для чего применяется и как настраиваются её свойства;
В чем главное достоинство контрола Panel?;
Множество вариантов изменения свойств всех контролов одновременно при работе приложения.
Урок 7 -Группировка контролов. Контрол Panel
Продолжительность: 17 минут
В этом уроке мы научимся группировать контролы на форме и другом родительском контроле. Узнаем для чего это делается и как все это используется
Как управлением одним контролом Panel позволяет управлять одновременно со всеми её дочерними контролами;
Как добавить на панель полосы прокрутки;
При каких обстоятельствах появляются полосы прокрутки;
Дополнительные настройки полосы прокрутки;
Работаем с контролом TextBox. Настраиваем внешний вид;
Работаем с контролом Label.
Урок 8 -Начало разработки первого проекта
Продолжительность: 22 минуты
В этом уроке мы произведём разбор технического задания на выполнение проекта
Читаем техническое задание и определяемся с технологиями необходимыми для решения поставленной задачи;
Создаем новый проект и сразу же настраиваем рабочее поле;
Добавляем на форму необходимое количество кнопок и настраиваем их;
Помещаем кнопки управления в контейнер GroupBox;
Подключаем необходимые пространства имен;
Под каждую кнопку создаем отдельный поток;
Определяемся с местом создания потоков
Создаем метод отвечающий за движение кнопки;
Определяем координаты экрана и формы.
Урок 9 -Кросспоточная работа. Метод Invoke
Продолжительность: 22 минуты
В этом уроке мы обнаружим самую большую преграду, с которой сталкиваются разработчики при проектировании многопоточных приложений
Почему мы не можем сдвинуть кнопки с места, используя потоки. Что за ошибка вылетает?
Оптимизируем код путем замены множества методов одним общим и доступным для разных потоков;
Решаем проблему кросспоточности посредством использования делегатов;
С помощью перегруженного метода Invoke получаем возможность вызывать метод делегата;
Кнопки двигаются. Но появились новые проблемы с кнопкой старт и закрытием приложения;
Добавляем в движение кнопок различные скоростные режимы.
Урок 10 -Добавление кнопок управления
Продолжительность: 20 минут
В этом уроке мы добавим в функциональность приложения возможность приостанавливать движение кнопок
Добавляем в логику работы кнопки "Пауза" приостановку выполнения потоков. Метод Suspend;
Еще одно исключение. Хитрый способ избавиться от данного исключения;
Решаем проблему повторного создания потоков при неоднократном нажатии на кнопке "Старт";
Решение новой проблемы возобновления не приостановленного потока - работаем с параметром sender;
Добавление функциональности кнопке "Стоп";
Анализ исключения при закрытии приложения в момент движения кнопок.
Урок 11 -Создание пользовательского контрола. Работа с изображениями
Продолжительность: 21 минута
В этом уроке мы добавляем изображение финиша в проект, а также расширяем функциональность класса Button
Быстро и легко устраняем возникновение ошибки при закрытии приложения;
Работаем с ресурсами. Примеры типов файлов-ресурсов;
Создаем финишную прямую в ресурсах проекта. Рисуем в редакторе графических ресурсов;
Помещаем изображение финишной прямой на форму;
Мгновенно определение лидирующей кнопки на протяжении всего движения путём сортировки массива;
Загоняем кнопки в обычный массив;
Исключение при попытке сортировать массив кнопок. Интерфейс IComparable;
Создаем пользовательский класс для своих собственных кнопок;
Реализовываем интерфейс IComparable для класса пользовательских кнопок;
Изменяем в файле-дизайнере тип контролов button на пользовательский тип.
Урок 12 -Определение и кодирование ключевых ситуаций в приложении
Продолжительность: 20 минут
В этом уроке мы реализуем функциональность, связанную с управлением состояний гоночных кнопок
Определив лидирующую кнопку, одеваем на неё "жёлтую майку" лидера;
Управляем доступностью кнопок управления - добавляем во все обработчики событий необходимый код;
Определяем логику для остановки движения кнопок на финише.
Урок 13 -Обзор разработанного кода
Продолжительность: 20 минут
В этом уроке мы повторяем ключевые моменты этапа разработки
Выводим на экран информацию о победившей кнопке;
Повторяем ключевые этапы разработки проекта;
Насыщаем код комментариями.
Урок 14 -Xml-документирование кода
Продолжительность: 22 минуты
В этом уроке мы занимаемся наполнение разработанного кода описательной информацией
Добавляем описательную информацию в формате xml для каждого метода программы;
Зачем разработчики добавляют в код коммерческого проекта комментарии и описания;
Вставка ключевых блоков кода в сворачивающиеся регионы;
Подпольные правила процесса разработки.
Урок 15 -Добавление звуковых эффектов в проект
Продолжительность: 20 минут
В этом уроке мы добавим в наш проект немного звуковых эффектов
Добавляем звуковой файл в качестве ресурса;
Добавляем необходимое пространство имен необходимое для работы с медиаресурсами;
Определяем место и время начала воспроизведения звукового эффекта;
Выводим звук езды на устройство воспроизведения звука;
Определяем время и место остановки звучания эффектов;
Какой формат звукового файла проще всего использовать в проекте?
Выполняем конвертацию звукового файла в необходимый формат с помощью программы Quick Mp3 Wav Converter;
Добавляем в ресурсы полученный файл;
Определяем моменты запуска и остановки фоновой мелодии приложения;
Быстро решаем проблему временной задержки перед началом проигрывания фоновой мелодии.
Урок 16 -Создание и добавление в проект иконки приложения
Продолжительность: 17 минут
В этом уроке мы создадим для приложения иконку
Добавляем в ресурсах файл-иконку;
Работаем над дизайном иконки;
Два способа назначить приложению иконку;
Улучшаем логику организации кода - создаем метод автоматического управления свойствами кнопок управления;
Замена определенных блоков кода на вызов данного метода.
Перейти к форме заказа
РАЗРАБОТКА ВИДЕОИГРЫ
Меню раздела 6.
В этом разделе мы разработаем реальное WinForms-приложени - видеоигру "Танки", а также, перед этим, рассмотрим несколько самых распространенных паттернов - шаблонов проектирования.
В курс вошли 55 уроков общей продолжительностью
15 часов и 32 минуты.

Урок 1 -Разбор требований
Продолжительность: 20 минут
В этом уроке мы разбираем и анализируем техническое задание на проект
Выяснение среды разработки и целевого языка;
Определение принципа движения и управления сущностей игры;
Выясняем ключевые моменты при запуске игры;
Оговорка необходимости применения паттернов. Понятие паттернов;
Определяем перечень необходимых технологий требуемых для реализации проекта.
Урок 2 -Паттерны проектирования
Продолжительность: 33 минуты
Этот урок повящен очень важной теме - теме о шаблонах проектирования (паттерны)
Что же такое паттерн. Для чего они созданы и когда их использование целесообразно;
Зависимы ли паттерны от конкретного языка;
Паттерны завязаны на классах, интерфейсах и структурах;
Выясняем все моменты относительно паттерна Singleton на практическом примере;
Выясняем все моменты относительно паттерна Factory Method (creational pattern) на практическом примере;
Выясняем все моменты относительно паттерна Abstract Factory (kit) на практическом примере.
Урок 3 -Паттерны проектирования (продолжение)
Продолжительность: 32 минуты
В этом уроке мы продолжаем детальный разбор распространенных паттернов проектирования
Разбираем все детали шаблона Adapter и две его модификации: Object Adapter и Class Adapter;
Разбираем шаблон Memento (память). В каких приложениях не обойтись без данного паттерна;
Разбираем все ключевые моменты паттерна Stratege;
Выясняем все моменты относительно паттерна MVC на практическом примере.
Урок 4 -Организация перерисовки формы
Продолжительность: 16 минут
В этом уроке мы разберем каким же образом происходит перерисовка окон любого приложения при работе с ними
Понимаем, что любое окно - это просто набор пикселов;
Выясняем ключевые моменты открытия любого оконного приложения;
Какие нюансы присутствуют при позиционировании нескольких окон на одном экране;
Каким образом происходит перерисовка любого окна на мониторе. Когда и при каких обстоятельствах;
Событие Paint. Для чего оно генерируется и при каких условиях оно генерируется автоматически;
Методы принудительной перерисовки форм: Refresh и Invalidate.
Урок 5 -Создание проекта
Продолжительность: 10 минут
В этом уроке мы создаем проект и выполняем первые настройки главного окна приложения
Создаем windows-проект и настраиваем главное окно;
Создаем и добавляем в проект иконку;
Запрещаем форме изменять свой размер - задаем фиксированный размер.
Урок 6 -Внедрение шаблона MVC
Продолжительность: 13 минут
В этом уроке мы реализуем шаблон MVC в нашем проекте путем создания дополнительных классов
Определяем классы, которые будут представлять каждую из трех частей паттерна MVC;
Определяемся с контролером;
Создаем класс под модельку;
Создаем класс под вьюшку;
Создаем user control в качестве поверхности для рисования игрового поля с сущностями на нем;
Определяемся с способом вывода цвета игрового поля;
Создаем определенный выше user control как часть паттерна MVC - View;
Добавляем данный контрол на форму.
Урок 7 -Работа над запуском приложения
Продолжительность: 16 минут
В этом уроке мы изменим код приложения так, что б можно было передавать в игру входные параметры
Добавляем в конструктор контролера необходимые параметры входных данных;
Создаем 4 перегрузки данного конструктора;
Изменяем метод Main так, что бы он мог принимать переменное число входных параметров и в зависимости от этого вызывал соответствующую перегрузку конструктора для контролера.
Урок 8 -Создание вражеских танков
Продолжительность: 12 минут
В этом уроке мы создаем объекты основных рабочих классов и связываем их между собой
Создаем класс танков;
Наполняем класс необходимыми членами;
Определяемся с размерами танка и, создав его, добавляем в ресурсы;
Создаем метод для движения танка;
Создаем экземпляры классов Model и View;
Передаем в экземпляр класса Model входные данные, для чего в данном классе перегружаем конструктор;
В классе Model создаем необходимые поля;
В классе Model создаем объект танка.
Урок 9 -Создание необходимых потоков
Продолжительность: 11 минут
В этом уроке мы закладываем фундамент для будущего "движения" объектов в работающем приложении
В классе Model создаем метод для движения сущностей;
Определяемся с базовой минимальной логикой данного метода;
Добавляем кнопку на форму для запуска /остановки игры. Определяем событие;
Почему кнопка "Стоп" не реагирует на нажатие во время проигрывания игры. Решаем данную проблему многопоточностью;
В классе Controller создаем отдельный поток. Выясняем место, где необходимо создавать экземпляр данного потока.
Урок 10 -Вывод танка на экране
Продолжительность: 15 минут
В этом уроке мы добиваемся появления изображения танка на экране
Оптимизируем работу кнопки "Старт/Стоп";
В классе View реализуем вывод танка на экране. Изменяем конструктор класса View на принятие входного параметра;
Выясняем один важный нюанс при позиционировании изображения танка на форме;
Выясняем объективные причины отсутствия изображения танка на форме после запуска приложения;
Подписываемся на событие Paint и наблюдаем танк на поле.
Урок 11 -Движение танка по экрану
Продолжительность: 9 минут
В этом уроке мы с Вами будем решать проблему не отображения реального движения танка по форме
Новая проблема - изображение танка не двигается по форме, хотя координаты танка действительно изменяются;
В необходимом месте заставляем форму себя перерисовывать;
Устанавливаем танку постоянную скорость движения.
Урок 12 -Работа с методом OnPaint
Продолжительность: 11 минут
В этом уроке мы оптимизируем и без того неплохой механизм перерисовки формы
Ставим под сомнение необходимость постоянной перерисовки формы;
Определяемся с оптимальной частотой перерисовки формы;
Заставляем перерисовку возникать с точно заданной частотой;
Избавляемся от подписки на событие Paint путем переопределения метода OnPaint. Зачем так?
Урок 13 -Создаем перечисление статуса игры
Продолжительность: 15 минут
В данном уроке мы используя пользовательское перечисление вносим больше эффективности в работу всех структурных единиц нашего приложения не нарушая взаимосвязей
Создаем перечисление для определения статуса игры;
На основе имеющегося перечисления расширяем функционал кнопки "Старт/Стоп";
Изменяем метод OnPaint на более экономичную работу через использование статуса игры;
Маленькое дополнение в контролере по поводу отрисовки формы.
Урок 14 -Правильное закрытие приложения
Продолжительность: 10 минут
В данном уроке мы добьемся нормального закрытия приложения при любых обстоятельствах
Подписываемся на событие закрытия формы и настраиваем его обработчик на нормальное завершение всех потоков приложения;
Используя пользовательское перечисление совершенствуем класс Model.
Урок 15 -Анализ и выбор способа движения
Продолжительность: 29 минут
В этом уроке мы рассмотрим возможные варианты управления движением танков. Определим для каждого преимущества и недостатки, после чего выберем для реализации лучший из них
Определяем возможности в своем движении танков;
Какие случаи могут происходить с танками при их взаимодействии с другими сущностями;
Определяем поочередность вывода сущностей на форме. Для чего это обдумывать;
Важное замечание по поводу появления блока на игровом поле;
Определяем границы игрового поля. Определяемся с размерами сущностей;
Варианты ситуации столкновения танков друг-с-другом;
Анализируем вариант зависимости танка от стен. Преимущества такого подхода;
Анализируем вариант независимости танка от стен - зависимость танка от пройденного им пути. Главный недостаток;
Находим самую эффективную и независимую модель движения танков.
Урок 16 -Обеспечение инкапсуляции
Продолжительность: 13 минут
В этом уроке мы подгоняем организацию кода под принцип ООП - инкапсуляцию
Создаем специальный класс, инкапсулирующий изображения танка;
В классе Tank заменяем поле изображения на объект
класса созданного выше;
Инкапсулируем соответствующие поля через свойства;
Подгоняем размер главной формы
Инкапсулируем координаты танка.
Урок 17 -Создание первых интерфейсов и стен
Продолжительность: 22 минуты
В этом уроке мы создадим новые классы под остальные сущности. А также создадим несколько интерфейсов для реализации паттерна Strategy
Создаем первый интерфейс перемещения танка IRun и определяем в нем метод Run;
В классе Tank реализовываем данный интерфейс;
Создаем интерфейс поворота танка ITurn и определяем в нем метод Turn;
Создаем интерфейс для инкапсуляции процесса подбора яблок;
Создаем интерфейс столкновений ICollision;
Определяем, что из себя должен представлять класс стен;
Создаем класс стен и соответствующий ему класс изображений стен;
Создаем изображение стены и добавляем его в ресурсы;
Наполняем кодом класс изображения для стен;
Наполняем кодом класс Wall, выводим множественные изображения стен на экран;
Впервые сталкиваемся с потребностью использовать буферизированную графику;
Вывод танка и вывод стен на экране разносим по отдельным методам.
Урок 18 -Работа над поворотами танка
Продолжительность: 24 минуты
В этом уроке мы добьемся правильного движения танка и поведения его на перекрестках
В классе танка вводим новые поля отвечающие за направления движения танка;
Определяем интересную логику для функции set соответствующих свойств выше указанных полей направления движения танка;
Работаем над логикой методов перемещения и поворота танка;
Заставляем танк двигаться по прямой и поворачивать в случайном порядке на перекрестках.
Урок 19 -Прозрачность стен для танка
Продолжительность: 18 минут
В этом уроке мы заставим наш танк проходить сквозь прозрачные границы игрового поля
Под прозрачные стены создаем интерфейс ITransparent и описываем в нем метод;
Реализовываем данный интерфейс в классе танка;
Определяем логику действия прозрачных стен;
Наполняем метод Transparent соответствующим кодом прозрачных стен;
Важный нюанс действия прозрачных стен - потеря 1-го пиксела;
Определяем ключевые моменты попытки выезда танка за границы поля.
Урок 20 -Рисование изображений для танка
Продолжительность: 17 минут
В этом уроке мы создадим множество разных изображений танков и добавление их в ресурсы и заставим танк двигаться всегда стволом вперёд
Создаем различные версии изображений движущегося танка;
Изменяем соответствующим образом класс, отвечающий за предоставление изображений для танка;
В классе Tank создаем новый метод для управления изменением изображения ввиду поворота танка на перекрестках;
Определяемся с местом и временем вызова метода смены изображений.
Урок 21 -Внедрение анимации движения танка
Продолжительность: 23 минуты
В этом уроке мы добавим в ресурсы проекта много новых изображений для поддержания эффекта движущихся гусениц и соответствующим образом изменим класс изображений танка
Определяемся с подходом для создания эффекта анимированных гусениц движущегося танка;
Создаем великое множество дополнительных изображений танка, которые будут участвовать в анимированном движении;
Полностью переписываем класс, отвечающий за предоставление изображения танка, загоняя все группы картинок по 4-м массивам;
Инкапсулируем все 4-е массива изображений;
Выполняем соответствующие изменения в классе Tank.
Урок 22 -Анимированный танк (продолжение)
Продолжительность: 22 минуты
В этом уроке мы завершаем с эффектом анимированных гусениц
Завершаем вывод конкретного изображения для танка в методе Run;
Добиваемся эффекта движения гусениц танка;
Определяем компромисс между ресурсоемкостью и скоростью работы приложения;
Исправляем закравшуюся ошибку в методе управления анимацией танка;
Ужесточаем права доступа на поля, инкапсулирующие изображения танка.
Урок 23 -Создание множества танков
Продолжительность: 25 минут
В этом уроке мы очень много рассуждаем о способе хранения множества танков и способе их начального позиционирования на игровом поле
Создаем массив танков. Определяемся с типом массива. Выясняем все "за" и "против";
Выясняем механизм размещения танков на игровом поле;
Создаем новый метод для размещения множества танков на поле;
Заменяем все вхождения в коде одиночного танка на массив танков;
Выясняем достаточный и эффективный подход для быстрого и правильного расположения танков на поле;
Реализовываем данный подход в методе расстановки танков.
Урок 24 -Создание множества танков (продолжение)
Продолжительность: 25 минут
В этом уроке мы завершаем разработку метода для правильного позиционирования танков при старте игры
Определяем способ установки координат танка кратным некоторому значению;
Создаем цикл проверки на существование текущей позиции;
Решаем проблему коллективизма - заставляем каждый танк двигаться в своем направлении.
Урок 25 -Столкновение танков
Продолжительность: 21 минута
В этом уроке мы разбираем процесс столкновения танков на показательных рисунках и анимациях
Разбираем варианты столкновения танков: лобовое, угловое и смешанное столкновение;
Определяем возможные места столкновения танков;
Обдумываем логику метода, отвечающего за механизм столкновения танков;
Рассматриваем "под микроскопом" процесс движения двух танков навстречу друг-другу
Очень важный, но с первого взгляда незначительный, нюанс, связанный с особенностью последовательной обработки множества танков;
Выясняем значение расстояния между двумя танками в момент столкновения;
Определяемся с классом, отвечающего за контролирование столкновения танков.
Урок 26 -Столкновение танков (продолжение)
Продолжительность: 14 минут
Здесь мы начнем реализовывать логику механизма разворота танков при их столкновении друг-с-другом
Создаем метод разворота танков в классе Tank и наполняем его простым кодом;
Расширяем класс Model на проверку условия столкновения танков. Создаем очень хитрые вложенные циклы.
Урок 27 -Столкновение танков (продолжение)
Продолжительность: 15 минут
Здесь мы завершаем с реализацией процесса столкновения двух танков
Совершенствуем логику разворота танков;
Анализируем условия углового столкновения и реализуем это в коде;
Заставляем танки правильно разъезжаться при столкновении.
Урок 28 -Создание яблок
Продолжительность: 17 минут
В этом уроке мы создаем яблоки и реализуем их в нашем приложении
Создаем класс яблок и наполняем его стандартным содержимым;
Рисуем яблоко и добавляем его в ресурсы проекта;
Создаем список яблок в классе Model и расставляем яблоки на поле;
Изменяем класс View на отображение яблок;
Выравниваем изображения яблок на игровом поле.
Урок 29 -Прическа кода
Продолжительность: 26 минут
В этом уроке мы настраиваем иерархию и взаимозависимость всех классов и интерфейсов нашего приложения - организовываем более связанную архитектуру приложения
Анализируем диаграмму имеющихся в нашем проекте классов и интерфейсов;
Добавляем описание методов в интерфейсах прямо в визуализаторе диаграмм;
Удаляем лишние (не использованные) интерфейсы и те, функциональность для которых реализована другими интерфейсами;
Определяем набор функциональности для каждой единицы кода проекта. Разносим данную функциональность по имеющимся сущностям;
Поддержку изображений для каждой сущности выносим на отдельный интерфейс;
Создаем список яблок в классе Model и расставляем яблоки на поле;
Размышляем над целесообразностью вынесения координат любой сущности в отдельную структуру.
Урок 30 -Создание класса "Пакмена"
Продолжительность: 18 минут
В этом уроке мы создаем класс для "Пакмена" и наполняем его необходимым содержимым
Определяемся с функциональностью класса "Пакмена";
Создаем класс "Пакмена" и наполняем его кодом;
Заносим в ресурсы все изображения для "Пакмена";
Создаем привычный класс изображений для "Пакмена";
Аналогично для класса танка создаем похожие методы и для класса "Пакмена";
Задаем начальное положение "Пакмена" на игровом поле;
Реализуем механизм прозрачных стен для "Пакмена";
Для реализации метода разворота "Пакмена" создаем новый интерфейс.
Урок 31 -Отображение и движение "Пакмена"
Продолжительность: 8 минут
В этом уроке мы добиваемся вывода "Пакмена" на екран и его непрерывного движения по игровому полю
Добавляем в класс View метод вывода изображения "Пакмена" на экране;
Добавляем объект "Пакмена" в классе Model;
Устраняем все ошибки и наблюдаем движение "Пакмена" на игровом поле.
Урок 32 -Поворот "Пакмена"
Продолжительность: 15 минут
В этом уроке мы подготовим фундамент для управления движением "Пакменом" с клавиатуры
Определяем контрол на форме, который будет реагировать на ввод информации с клавиатуры;
Подписываем данный контрол на событие нажатия клавиши клавиатуры;
Реализуем код определения нажатой клавиши и соответствующего реагирования "Пакмена";
Разрабатываем алгоритм правильного управления "Пакменом" - невозможность изменять направление движения не в перекрестка.х
Урок 33 -Поворот "Пакмена" (продолжение)
Продолжительность: 13 минут
В этом уроке мы завершаем разработку метода, отвечающего за управление "Пакменом" с клавиатуры
Расширяем класс "Пакмена" посредством ввода новых свойств относительно направления движения;
Добиваемся правильного поведения "Пакмена" между перекрестками.
Урок 34 -Подбор "Пакменом" яблок
Продолжительность: 15 минут
В этом уроке мы разрабатываем алгоритм реализации подбора "Пакменом" яблок
Определяем класс и метод, в котором будет осуществляться "наезд "Пакмена" на яблоки";
Выбираем один из возможных способов помещения подобранного яблока на линейку трофеев;
Реализуем подбор яблок и вывод на линейке трофеев в соответствующем методе.
Урок 35 -Подбор яблок (продолжение)
Продолжительность: 16 минут
В данном уроке мы завершаем работу над процессом подбора и вывода подобранных яблок
Расширяем функционал выше использованного метода на ведение счета количества подобранных яблок;
Модифицируем метод создания новых яблок;
Исправляем досадную и не всегда заметную ошибку связанную с динамическими коллекциями яблок;
Добавляем условие завершения игры при подборе необходимого количества яблок;
Реализовываем правильный вывод собранных яблок - вряд по одной линии.
Урок 36 -Правильное расположение яблок
Продолжительность: 7 минут
В этом уроке мы решаем проблему, связанную с неправильной расстановкой яблок на игровом поле
Размышляем над возможными причинами неправильного расположения яблок на игровом поле;
Устраняем причину неправильного расположения яблок;
Тестируем текущую сборку проекта.
Урок 37 -Столкновение "Пакмена" с танком
Продолжительность: 9 минут
В этом уроке мы реализуем механизм столкновения "Пакмена" с одним из вражеских танков
Решаем постоянный вопрос относительно класса, в котором будет выполняться проверка факта столкновения "Пакмена" с танками;
Используя координаты танков и "Пакмена", а также перечисление статуса игры дополняем класс Model проверкой на столкновение "Пакмена" с одним из танков;
Тестируем и оптимизируем условие проверки столкновения.
Урок 38 -Создание "Охотника"
Продолжительность: 15 минут
В этом уроке мы внедряем в наш проект независимую сущность "Охотник"
Решаем проблему невозможности подбора самого верхнего яблока на поле;
Создаем класс для "Охотника" и класс для изображений "Охотника";
Садимся сразу на 3 стула одной *опой путем наследования класса "Охотника" от класса танка;
Создаем изображения для "Охотника" и добавляем их в ресурсы проекта;
Помечаем модификатором доступа те члены класса танка, которые должны быть унаследованы в классе "Охотника".
Урок 39 -Работа над "Охотником"
Продолжительность: 31 минута
В этом уроке мы создаем основу для реализации процесса погони "Охотника" за "Пакменом"
анализируем проблемы наследования в классах танка и "Охотника";
Наполняем класс "Охотника" его личными членами;
Благодаря наследованию мы помещаем в список танков еще и "Охотника";
Определяем логику движения "Охотника."
Урок 40 -Движение "Охотника"
Продолжительность: 30 минут
В этом уроке мы добиваемся от "Охотника" правильного движения
Одеваем "Охотника" в его собственную картинку;
Решаем многочисленные проблемы "переодевания" "Охотника" в картинку танка;
Заставляем "Охотника" передвигаться по игровому полю;
Разрабатываем метод поворота "Охотника" в перекрестках;
Тестируем работу текущего билда проекта и отлавливаем ошибки.
Урок 41 -Устранение ошибок в коде
Продолжительность: 7 минут
В этом уроке мы исправляем некоторые ошибки в логике движения "Охотника"
Устраняем невидимую ошибку в логике поворота "Охотника";
класс "Охотника" избавляем от неиспользуемых полей.
Урок 42 -Создание снаряда для "Пакмена"
Продолжительность: 15 минут
В этом уроке мы разрабатываем и добавляем в проект сущность "Снаряд"
Создаем класс для снаряда и класс для изображений снаряда;
Создаем изображение для снаряда и добавляем его в ресурсы;
Наполняем класс снаряда необходимым кодом;
Определяем условия и место выпуска снаряда "Пакменом"
Вводим в класс Model объект снаряда
Определяем факт нажатия клавиши клавиатуры для определения момента выпуска снаряда.
Урок 43 -Движение снаряда
Продолжительность: 15 минут
В этом уроке мы продолжаем настраивать движение "капризного" снаряда
В классе Controll определяем направление, скорость движения и координаты вылета снаряда при нажатии соответствующей клавиши на клавиатуре;
Изменяем класс View на вывод изображения снаряда;
Настраиваем модификаторами члены класса снаряда;
Решаем возникновение исключительной ситуации при попытке вывода невыпущенного снаряда.
Урок 44 -Настройка раскладки клавиатуры
Продолжительность: 18 минут
В этом уроке мы для клавиш управления добавляем несколько распространенных языков и также выполняем настройку траектории движения снаряда
В классе Controll в методе определения нажатой клавиши управления реализовываем поддержку нескольких языков для срабатывания клавиш управления на разных языковых раскладках;
Центрируем траекторию движения снаряда.
Урок 45 -Подбитые танки. Создание, внедрение
Продолжительность: 24 минуты
В этом уроке мы осуществляем процесс подбития вражеских танков снарядом и отображение анимированного огня на них
Создаем изображения пылающего танка и добавляем их в ресурсы проекта;
Создаем класс пылающего танка и класса изображений пылающего танка;
Наполняем данные классы привычным содержимым;
Расширяем класс Model объектами класса пылающего танка;
Реализуем главный метод пылающего танка, отвечающего за отображение огня на подбитом танке;
Определяем условия, при которых вражеский танк может считаться подбитым;
Удаляем подбитый танк с поля и на его месте выводим пылающего танка.
Урок 46 -Правильное движение снаряда
Продолжительность: 16 минут
В этом уроке мы настраиваем эффект воздействие друг-на-друга снаряда и подбиваемого танка
Снова решаем знакомую проблему относительно динамического изменения количества элементов в списке пылающих танков;
Выясняем проблемные места в блоке определения попадания снаряда в танк;
Добиваемся правильного попадания снаряда в танк;
Устраняем эффект прозрачности танков по отношению к движущемуся снаряду.
Урок 47 -Правильное движение снаряда (продолжение)
Продолжительность: 15 минут
В этом уроке мы окончательно настраиваем поведение снаряда, а главное - ограничиваем максимальную дальность полета снаряда
Задаем снаряду граничную дальность полета;
В классе снаряда вводим счетчик километража для определения момента прекращения дальнейшего движения снаряда;
Подчищаем последние штрихи по движению снаряда.
Урок 48 -Работа над дизайном кнопки "Start"
Продолжительность: 14 минут
В этом уроке мы настраиваем внешний вид и поведение кнопки запуска и остановки игры
Создаем изображения кнопки "Start" и добавляем их в ресурсы проекта;
Определяемся с наилучшим способом придания данной кнопке пользовательского вида нарисованных кнопок;
Принимаем решение заменить объект класса Button объектом класса PictureBox;
Новому контролу назначаем пользовательское изображение кнопки "Start";
Задаем фоновый цвет главного окна приложения;
Кодируем логику автоматического изменения внешнего вида кнопки "Start" в виду её состояния;
Добавляем на форму контрол toolTip и назначаем его контролу PictureBox для создания всплывающей подсказки;
Производим настройку свойств внешнего вида и поведения всплывающей подсказки.
Урок 49 -Обработка событий клавиатуры
Продолжительность: 6 минут
В этом уроке мы снова работаем с кодом определения нажатой клавиши клавиатуры для управления поведением "Пакмена"
Создаем новый метод определения нажатой клавиши клавиатуры для новой кнопки "Start";
Переписываем код определения значения нажатой клавиши из-за особенностей данного события для контрола PictureBox;
Автоматическое упрощение кода относительно поддержки нескольких языковых раскладок клавиатуры;
Зачем принудительно устанавливать новую кнопку в фокус и где это делать.
Урок 50 -Создание пользовательского меню
Продолжительность: 17 минут
В этом уроке мы создаем панель меню и подменю. Настраиваем их внешний вид
Добавляем на форму панель меню;
В панели меню добавляем элементы подменю;
Настраиваем внешний вид панели меню;
Назначаем каждому элементу меню и подменю сочетания горячих клавиш для вызова их с клавиатуры;
Каждому элементу подменю назначаем соответствующие обработчики события нажатия;
Работаем над пунктом меню выхода из приложения;
Создаем иконки для пунктов меню и добавляем их в ресурсы проекта;
Каждому пункту меню назначаем соответствующую иконку.
Урок 51 -Работа с элементами меню - подменю
Продолжительность: 16 минут
В этом уроке мы работаем с динамическим поведением подпунктов меню
Работаем с пунктом меню создания новой игры;
Взвешиваем все "за" и "против" относительно повторного использования существующих сущностей с предыдущего запуска игры;
Создаем и наполняем кодом метод для запуска новой игры;
Решаем проблему стирания части игрового поля вылетевшим подпунктом меню. Устанавливаем причину;
Реализовываем вывод окна подсказки после выбора соответствующего подпункта меню;
Работаем с подпунктом меню включения/выключения звука игры;
Добиваемся смены иконки подпункта меню звука в зависимости от выбранного звукового режима.
Урок 52 -Двойная буферизация
Продолжительность: 23 минуты
В этом уроке мы работаем с строкой состояния и двойной буферизацией вывода графики
Устраняем появившиеся проблемы с отображением подобранных яблок;
Добавляем на форму строку состояния и настраиваем её внешний вид;
Кодируем изменение отображения текущего статуса игры на строке состояния;
Осуществляем необходимость оповещения контролера из модели не нарушив структуры шаблона MVC;
Создаем пользовательское событие изменения статуса игры;
Подписываем наш контролер на пользовательское событие;
Понятие двойной буферизации. Выяснение причин сильного мерцания изображения формы в месте ближе к нижнему краю окна. Настраиваем приложение на двойную буферизацию.
Урок 53 -"Прическа" кода и метод Invoke
Продолжительность: 9 минут
В этом уроке мы наводим порядок в организации кода классов, а также устраняем потенциальную проблему кросспоточной работы
Наводим порядок в организации кода - упорядочиваем поля и методы, а также инкапсулируем все открытые поля классов;
Группируем закрытые, открытые и полуоткрытые члены классов в отдельные группы;
Обращаемся к знакомому методу для решения проблемы кросспоточной работы;
Снова закрываем возможность изменять размер главного окна приложения.
Урок 54 -Внедрение звука в проект
Продолжительность: 13 минут
В этом уроке мы добавляем в наш проект звуки движения настоящих танков
Проводим анализ шаблона MVC для определения класса, в котором будет происходить работа со
звуками приложения;
Переносим целевой медиафайл в ресурсы проекта;
Создаем в выбранном классе поле для хранения звукового ресурса;
Используя перечисление статуса игры создаем условие проигрывания звуковых эффектов;
Реализовываем возможность отключения пользователем звуковых эффектов через пункт меню.
Урок 55 -Последние исправления
Продолжительность: 14 минут
В этом уроке мы придадим коду программы товарного вида. Подтяним недочеты и повыбрасываем излишние блоки кода
Разбиваем многострочные методы на несколько более мелких методов;
Выносим все литералы, встречающиеся в коде в константы, в статические поля, или в переменные
другого типа;
Опять группируем члены классов по их уровню видимости.
Перейти к форме заказа