
- •Лекция 1. Введение. Платформа .Net. Среда Visual Studio.Net. Консольные приложения
- •Платформа .Net
- •Среда Visual Studio.Net
- •Консольные приложения
- •Заготовка консольной программы
- •Вопросы для самоконтроля
- •Лекция 2. Основные понятия языка Алфавит и лексемы
- •Алфавит с# включает:
- •Идентификаторы
- •Ключевые слова
- •Знаки операций и разделители
- •Литералы
- •Лекция 3. Типы данных с#. Переменные, операции, выражения
- •Встроенные типы
- •Типы-значения и ссылочные типы
- •Упаковка и распаковка
- •Переменные
- •Пример описания локальных переменных
- •Именованные константы
- •Операции и выражения
- •Преобразования встроенных арифметических типов-значений
- •Явное преобразование типа
- •Основные операции с#
- •Решение дз
- •Математические функции – класс Math
- •Лекция 5. Операторы языка c#
- •Блок или составной оператор
- •Пустой оператор
- •Операторы выбора (ветвления)
- •Оператор if
- •If(выражение_1) оператор_1;
- •If(выражение1) if(выражение2) if(выражение3) ...
- •Примеры оператора if:
- •Следует избегать проверки ве5щественных величин на равенство, вместо этого лучше сравнивать модуль их разности с некоторым малым числом:
- •Оператор switch (переключатель)
- •Операторы перехода
- •Оператор goto
- •Операторы break и continue
- •Оператор return
- •Лекция 6. Операторы цикла
- •Цикл с предусловием while
- •While ( выражение ) оператор
- •Цикл с постусловием do
- •Do оператор while выражение;
- •Цикл с параметром for
- •Цикл перебора foreach
- •Рекомендации по выбору оператора цикла
- •Лекция 7. Массивы
- •Одномерные массивы
- •Прямоугольные массивы
- •Класс System.Array
- •Оператор foreach для работы с массивами
- •Примеры обработки массивов с использованием класса Array
- •Лекция 8. Строки
- •Работа с символами в с#
- •Массивы символов
- •Строки типа string
- •Операции над строками
- •Форматирование строк
- •Пользовательские шаблоны форматирования
- •Строки типа StringBuilder
- •Лекция 9. Класс Random. Функции в языке с#
- •Функции (методы) в языке с#
- •Способы обмена информацией
- •Параметры-значения
- •Параметры-ссылки
- •Выходные параметры
- •Модифицированный пример применения выходных параметров
- •Лекция 10. Указатели в языке с# Небезопасный код
- •Синтаксис указателей
- •Указатель void
- •Преобразование указателей
- •Инициализация указателей
- •Арифметические операции с указателями
- •Приоритетность выполнений операций с указателями
- •Указатель на указатель
- •Операция stackalloc
- •Лекция 11. Файлы в с# Основные понятия. Классы .Net для работы с файлами
- •Виды файлов
- •Алгоритм работы с файловыми потоками
- •Байтовые файлы (потоки)
- •Обработка исключительных ситуаций при работе с файлами
- •Текстовые файлы
- •Пример преобразования чисел, содержащихся в текстовом файле
- •Консольный ввод-вывод
- •Работа с каталогами и файлами
- •Лекция 12. Структуры и перечисления в языке с#
- •Перечисления
- •Операции с перечислениями
- •Базовый класс System.Enum
- •Рекомендации по программированию
- •Пример программы с использованием структур с методами и перечислений
- •Лекция 13. Основные понятия ооп. Классы.
- •Данные: поля и константы
- •Виды элементов класса
- •Лекция 13_часть 2. Ооп. Члены класса. Основные свойства ооп
- •Члены класса
- •Свойства и поля
- •Конструкторы
- •Деструкторы
- •Статические члены класса и члены класса экземпляра
- •Интерфейсы
- •Основные свойства ооп
- •3. Полиморфизм
- •Упражнения к лекции
- •Решение дз
- •Лекция 14. Конструкторы. Параметр this. Ключевое слово this
- •Конструкторы
- •Конструкторы класса (статические конструкторы)
- •Класс “ Monster”
- •Свойства класса
- •Рекомендации по программированию
- •Лекция 15. Наследование. Виртуальные функции. Сокрытие методов базового класса. Абстрактные и закрытые классы Наследование
- •Особенности поведения конструкторов при наследовании
- •Пример программы иерархии наследования с использованием конструкторов
- •Синтаксис объявления наследования
- •Виртуальные методы
- •Правила использования виртуальных методов
- •Сокрытие методов базового класса
- •Вызов переопределенных или скрытых методов базового класса
- •Абстрактные классы и функции
- •Правила работы с абстрактными классами и методами:
- •Пример использования абстрактного класса
- •Закрытые (изолированные) классы и методы
- •Лекция 16. Интерфейсы. Использованием интерфейсов
- •Пример описания, реализации и использования интерфейса
- •Void Draw(); //простой метод вывода имени монстра
- •Int Attack(int a); //реализация атаки с заданной силой
- •Void Die(); // метод вывода на экран сообщения о смерти монстра
- •Int Power { get; } //свойство, вычисляющее силу монстра
- •Лекция 17. Семейства. Индексаторы
- •Пример использования семейства System.Collections.ArrayList
- •Определение собственных семейств
- •Индексаторы
- •Пример с использованием собственного семейства
- •Семейства с доступом по ключу и интерфейс iDictionary
- •Индексаторы и пользовательские классы
- •Лекция 18. Перегрузка методов и операций в классах Перегрузка методов
- •Перегрузка операций
- •Перегрузка унарных операций
- •Пример перегрузки унарных операций на примере класса
- •Перегрузка бинарных операций
- •Public static тип_возвр_знач operator бинарная_операция (параметр1, параметр2),
- •Пример перегрузки бинарных операций на примере класса
- •Класс System.Object
- •Пример перегрузки операций сравнения с использованием стандартных методов класса Object
- •Лекция 19. Стандартные интерфейсы. Клонирование. Итераторы Стандартные интерфейсы .Net
- •Сравнение объектов (интерфейс iComparable)
- •Пример использования стандартного интерфейса iComparable на примере класса Monster
- •Сортировка объектов по различным критериям (интерфейс iComparer)
- •Пример использования стандартного интерфейса iComparer на примере класса Monster
- •Клонирование объектов (интерфейс iCloneable)
- •Перебор элементов (интерфейс iEnumerable) и итераторы
- •Пример работы класса с итератором
- •Примеры применения простейших итераторов
- •Лекция 20, 21. Делегаты и события
- •Пример делегата для обычной функции
- •Пример делегата для метода класса
- •1.Делегат для выбора методов на этапе выполнения
- •Delegate.Invoke или что там внутри? (для продвинутых)
- •Пример делегата для работы с несколькими методами
- •2. Делегат как оповещатель. Паттерн «наблюдатель»
- •Пример делегата для оповещения наблюдателей
- •3. Делегат как процедура обратного вызова
- •Пример передачи делегата в качестве параметра функции
- •4.Делегат, как обработчик событий
- •[Cпецификаторы] event тип делегата имя события, где
- •Пример делегата для оповещения наблюдателей с помощью событий
- •Стандартные делегаты
- •Пример стандартного делегата EventHandler для оповещения наблюдателей с помощью событий
- •Лекция 21. Сборки, библиотеки, атрибуты, директивы. Сборка
- •Создание собственной библиотеки
- •Пример создания и использования собственной библиотеки
- •Рефлексия
- •Пример применения рефлексии
- •Атрибуты
- •Пространство имён
- •Директивы препроцессора
- •Пример использования директив препроцессора
- •Лекция 22. Классы прототипы, параметризованные коллекции
- •Создание класса-прототипа
- •//При использовании класса-прототипа вместо параметра т подставляется //конкретный тип данных
- •Ограничения
- •Обобщенные методы
- •Преимущества использования параметризованных классов и методов:
Пример использования семейства System.Collections.ArrayList
Класс System.Collections.ArrayList — один из классов в пространстве имен System.Collections— тоже реализует интерфейсыIEnumerable,ICollectionиIList. В то время как массивы обладают фиксированным размером (нет возможности добавлять или исключать элементы), этот класс может использоваться для представления списков элементов переменной длины. Чтобы получить представление о том, какими возможностями обладают такие усложненные семейства, рассмотрим пример, в котором наряду с классом System.Collections.ArrayList будет использоваться и обыкновенный массив.
using System;
using System.Collections;
…
public abstract class Animal //абстрактный класс Животное
{
protected string name;
public string Name
{
get
{return name;}
set
{name = value;}
}
public Animal()
{name = "Животное без имени";}
public Animal(string newName)
{name = newName;}
public void Feed()
{Console.WriteLine("{0} кушает ", name);}
}
public class Cow: Animal //класс Корова, производный от абстрактного
{
public void Milk()
{Console.WriteLine("{0} дает молоко", name);}
publicCow(stringnewName):base(newName) //конструктор вызывает базовый конструктор
{}
}
publicclassChicken:Animal//класс Курица, производный от абстрактного
{
public void LayEgg()
{
Console.WriteLine("{0} несет яйца", name);
}
public Chicken(string newName): base(newName)
{}
}
class Class
{
static void Main(string[] args)
{
Console.WriteLine("Создание нового массива животных в виде стандартного Array: " );
//СТРОГО ФИКСИРОВАННОЕ КОЛИЧЕСТВО ЭЛЕМЕНТОВ!
Animal[] animalArray = new Animal[2];
Cow myCow1 = new Cow("Буренка1") ;
//2 способа задания элементов массива
//1 способ - путем присваивания уже существующего объекта класса Cow
animalArray[0] =myCow1;
//2 способ – через создание нового объекта класса Chicken
animalArray[1] =newChicken("Курица1") ;
Основное отличие между этими способами заключается в том, что в первом случае мы получаем ссылку на объект, находящийся в массиве. В семействе ArrayList не существует никаких элементов, даже ссылающихся на null.
Класс System.Array реализует интерфейс IEnumerable, а единственный метод этого интерфейса - GetEnumerator(), позволяет проходить в цикле по всем элементам семейства.
foreach(AnimalmyAnimalinanimalArray) //цикл перебора по 1 элементу в массиве
{
Console.WriteLine(" Новый {0} элемент добавлен в массив," +
"имя = {1}", myAnimal.ToString(), myAnimal.Name);
}
//использование свойства Length, стандартного для классаSystem.Array
Console.WriteLine("Массив содержит {0} элементов",animalArray.Length);
//метод Feed() есть у всех производных отAnimal
animalArray[0].Feed();
//метод LayEgg() есть только у классаChicken, поэтому здесьявное приведение типов
((Chicken)animalArray[1]).LayEgg();
//Демонстрация работы с семейством - классом ArrayList
Console.WriteLine("Использование классаArrayList");
ArrayList animalArrayList = new ArrayList();
Cow myCow2=new Cow("Буренка2");
//2 способа задания элементов массива
//КОЛИЧЕСТВО ЭЛЕМЕНТОВ НЕ ФИКСИРУЕТСЯ, использовать метод Add()
animalArrayList.Add(myCow2);
animalArrayList.Add(new Chicken ("Курица 2"));
foreach (Animal myAnimal in animalArrayList)
{
Console.WriteLine(" Новый {0} элемент добавлен в ArrayList," + " имя = {1}", myAnimal.ToString(), myAnimal.Name);
}
//использование свойства Countдля классаArrayList
Console.WriteLine("Массив содержит {0} элементов",animalArrayList.Count);
Семейства — независимо от того, являются ли они массивами или более сложными семействами — должны предусматривать обеспечение доступа к принадлежащим им элементам. Простые массивы строго типизированы, т. е. они обеспечивают непосредственный доступ к типу своих элементов. Семейство ArrayList — это семейство объектов класса System.Object. Это значит, что необходимо выполнить приведение типа для всех его элементов:
//так как ArrayListсодержит разные экземпляры классов, то для вызова соответcтвующих //методов необходимо применить соответствующие преобразования
((Animal)animalArrayList[0]).Feed();
((Chicken)animalArrayList[1]).LayEgg();
Console.WriteLine("Демонстрация действий с ArrayList:");
//метод RemoveAt() удаляет заданный элемент (по индексу) из списка
animalArrayList.RemoveAt(0);
//единственным элементом, оставшимся в семействе, является объект класса chicken,
//доступ к которому осуществляется следующим образом:
((Animal)animalArrayList[0]).Feed();
Выполнение любых операций над элементами объекта ArrayList, в результате которых в этом массиве останется N элементов, будет производиться таким образом, что этим элементам будут соответствовать индексы в диапазоне от 0 до N-I. Так, например, удаление элемента с номером 0 приводит к тому, что все остальные элементы сдвигаются в массиве на одну позицию, поэтому доступ к объекту класса Chicken осуществляется с индексом 0, а не 1. А поскольку теперь в массиве не существует элемента с индексом 1 (с самого начала было всего два элемента), то при попытке выполнить следующий код будет сгенерирована исключительная ситуация: ((Animal)animalArrayList[1]).Feed();
//метод AddRange() добавляет в список несколько элементов – в данном случае - массив
animalArrayList.AddRange(animalArray);
((Chicken)animalArrayList[2]).LayEgg();
//использование свойства IndexOfдля классаArrayList
Console.WriteLine("Животное {0} с индексом {1}",myCow1.Name,animalArrayList.IndexOf(myCow1));
myCow1.Name="Новая Буренка1";
//использование свойства Name, определенного в классеAnimal
Console.WriteLine("Животное (0)",((Animal)animalArrayList[1]).Name);
Console.ReadLine(); }}}
В этом примере создается два семейства объектов, причем первое — с использованием класса System.Array (т. е. обыкновенный массив), а второе — с использованием класса System.ArrayList. Оба они являютсясемействами объектов класса Animal.Класс Animal является абстрактным классом, следовательно, создание экземпляров этого класса является недопустимым; однако за счет использования полиморфизма имеется возможность включить в состав семейства экземпляры классаCow и классаChicken, которые являются производными от класса Animal. Эти массивы создаются в методе Main(), после чего над ними производятся различные манипуляции, показывающие их характеристики и возможности.
Некоторые из продемонстрированных операций применимы как к семейству Array, так и к семейству ArrayList, хотя и имеются незначительные отличия в синтаксисе. Однако есть и такие операции, выполнение которых оказывается возможным только с более сложным типом ArrayList.