- •Лекция 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. Классы прототипы, параметризованные коллекции
- •Создание класса-прототипа
- •//При использовании класса-прототипа вместо параметра т подставляется //конкретный тип данных
- •Ограничения
- •Обобщенные методы
- •Преимущества использования параметризованных классов и методов:
Свойства класса
Свойства служат для организации доступа к полям класса. Как правило, свойство связано с закрытым полем класса и определяет методы его получения и установки.
Синтаксис свойства:
[ атрибуты ] [спецификаторы] тип имя_свойства
{
[get код_доступа]
[set код_доступа]
}
Значения спецификаторов для свойств и методов аналогичны. Чаще всего свойства объявляются как открытые (со спецификатором public), поскольку они входят в интерфейс объекта.
Код доступа представляет собой блоки операторов, которые выполняются при получении (get) или установки (set) свойства. Может отсутствовать либо часть get, либо set, но не обе одновременно. Если отсутствует часть set, свойство доступно тольно для чтения (read-only), если отсутствует часть get, свойство доступно только для записи (write-only).
В версии C# 2.0 введена удобная возможность задавать разные уровни доступа для частей get и set. Например, во многих классах возникает потребность обуспечить неограниченный доступ для чтения и ограниченный – для записи.
Спецификаторы доступа для отдельной части должны задавать либо такой же, либо белее ограниченный доступ, чем спецификатор доступа для свойства в целом. Например, если свойство описано как public, его части могут иметь любой спецификатор доступа, а если свойство имеет доступ protected internal, его части могут объяыляться как internal, protected или private.
Синтаксис свойства в версии 2.0 имеет вид:
[атрибуты] [спецификаторы] тип имя_свойства
{
[ [атрибуты] [спецификаторы] get код_доступа]
[ [атрибуты] [спецификаторы] set код_доступа]
}
Пример описания свойств:
public class Button: Control
{
private string caption; //закрытое поле, с которым связано свойство
public string Caption { //свойство
get { //получения свойства
return caption;
}
set { //способ установки свойства
if (caption != value) {
caption=value;}
}}
...}
//Двоеточие между именами Button и Control в заголовке класса Button означает, что класс //Button является производным от класса Control.
Метод записи обычно содержит действия по проверке допустимости устанавливаемого значении, метод чтения может содержать, например, поддержку счетчика обращений к полю.
В программе свойство выглядит как поле класса, например:
Button ok=new Button();
ok.Caption = “ОК”; //вызывается метод установки свойства
string s=ok.Caption; //вызывается метод получения свойства
При обращении к свойству автоматически вызываются указанные в нем методы чтения и установки.
Синтаксически чтение и запись свойства выглядят почти как методы. Метод get должен содержать оператор return, возвращающий выражение, для типа которого должно существовать неявное преобразование к типу свойства. В методе set используется параметр со стандартным именем value, который содержит устанавливаемое значение.
Вообще говоря, свойство может и не связываться с полем. Фактически, оно описывает один или два метода, которые осуществляют некоторые действия над данными того же типа, что и свойства. В отличие от открытых полей, свойства обеспечивают разделение между внутренним состоянием объекта и его интерфейсом и, таким образом, упрощает внесение изменения в класс.
С помощью свойств можно отложить инициализацию поля до того момента, когда оно фактически потребуется, например:
class A
{
private static ComplexObject x; //закрытое поле
public static ComplexObject X //свойство
{
get
{
if (x= =null)
{
x=new ComplexObject(); //создание объекта при 1-м обращении
}
return x;
} }. . .}
Добавим в класс Monster, описанный в приведенном выше примере, свойства, позволяющие работать с закрытыми полями этого класса. Свойства Name сделаем доступным только для чтения, поскольку имя объекта задается в конструкторе и его изменение не предусмотрено, в свойствах Health и Ammo введем проверку на положительность устанавливаемой величины. Код класса несколько разрастется, зато упроститься его использование.
Пример: Класс Monster со свойствами
using System;
namespace ConsoleApplication1
{
class Monster
{
public Monster()
{
this.health = 100;
this.ammo = 100;
this.name="Noname";
}
public Monster(string name) : this()
{
this.name = name;
}
public Monster(int health, int ammo, string name)
{
this.health = health;
this.ammo = ammo;
this.name = name;
}
public int Health //свойство Health связано с полем health
{
get
{
return health;
}
set
{
if (value > 0) health = value;
else health = 0;
}
}
public int Ammo //свойство Ammo связано с полем ammo
{
get
{
return ammo;
}
set
{
if (value > 0) ammo = value;
else ammo = 0;
}
}
public string Name //свойство Name связано с полем name
{
get
{
return name;
}
}
public void Passport()
{
Console.WriteLine("Monster {0} \t health ={1} ammo={2}", name, health, ammo);
}
string name;
int health, ammo;
}
class Class1
{ static void Main()
{
Monster Masha = new Monster(200, 200, "Masha");
Masha.Passport();
--Masha.Health; //использование свойств
Masha.Ammo += 100; //использование свойств
Masha.Passport();
Console.ReadKey();
} }}
Результат работы программы:
Monster Masha health = 200 ammo = 200
Monster Masha health = 199 ammo = 300
