- •1 Основные сведения о C#
- •1.1 Особенности языка
- •1.2 Типы данных
- •1.3 Переменные
- •1.4 Константы (литералы)
- •1.5 Операторы, используемые при построении выражений
- •1.6 Класс Object
- •1.7 Класс Math
- •1.8 Класс Convert
- •1.9 Пространство имён
- •1.10 Типы, допускающие значение null
- •2 Операторы и конструкции С#
- •2.1 Операторы присваивания
- •2.2 Приведение типов
- •2.3 Операторы инкремента и декремента
- •2.4 Операторные скобки {}
- •2.5 Условный оператор if
- •2.6 Логические операторы «И» и «ИЛИ»
- •2.7 Условный оператор ? :
- •2.8 Оператор выбора switch и оператор прерывания break
- •2.9 Оператор цикла for
- •2.10 Оператор цикла while
- •2.11 Оператор цикла do...while
- •2.12 Операторы прерываний break (для циклов) и continue
- •2.13 Оператор new
- •2.14 Массивы
- •2.14.1 Одномерные массивы
- •2.14.2 Многомерные массивы
- •2.14.3 Ступенчатые массивы
- •2.14.4 Работа с массивами как с объектами
- •2.15 Оператор цикла foreach
- •2.16 Строки
- •2.17 Перечисления
- •2.18 Обработка исключений
- •2.18.1 Класс Exception и стандартные исключения
- •2.18.2 Блок try...catch
- •2.18.3 Блок try...finally
- •2.18.4 Блок try...catch...finally
- •2.18.5 Оператор throw
- •3 Классы. Основные понятия
- •3.1 Общая схема
- •3.2 Спецификаторы доступа
- •3.3 Поля
- •3.4 Создание объекта и доступ к его членам
- •3.5 Методы
- •3.5.1 Перегрузка методов
- •3.5.2 Новое в версии C# 4.0
- •3.6 Конструкторы
- •3.7 Деструкторы
- •3.8 Инициализаторы объектов
- •3.9 Свойства
- •3.10 Индексаторы
- •4 Классы. Расширенное использование
- •4.1 Статические классы и члены классов
- •4.2 Наследование
- •4.2.1 Наследование и конструкторы
- •4.2.2 Переопределение членов класса
- •4.3 Полиморфизм
- •4.3.1 Виртуальные методы
- •4.3.2 Абстрактные классы и члены классов
- •4.3.3 Операторы as и is
- •4.3.4 Модификатор sealed
- •4.4 Перегрузка операторов
- •5 Интерфейсы
- •6 Делегаты, лямбда-выражения и события
- •6.1 Делегаты
- •6.2 Анонимные методы и лямбда-выражения
- •6.3 События
- •7 Универсальные типы
- •7.1 Общая схема
- •7.2 Ограничения по параметрам типа
- •7.2.1 Ограничение на базовый класс
- •7.2.2 Ограничение на интерфейс
- •7.2.3 Ограничение на конструктор
- •7.2.4 Ограничения ссылочного типа и типа значения
- •7.3 Параметры типы в методах
- •7.4 Некоторые универсальные типы С#
- •7.4.1 Класс Array
- •7.4.2 Класс List<T>
- •7.4.3 Класс LinkedList<T>
- •7.4.4 Класс Queue<T>
- •7.4.5 Класс Stack<T>
- •7.4.6 Классы SortedSet<T> и HashSet<T>
- •7.4.7 Классы Dictionary<TKey, TValue> и SortedDictionary<TKey, TValue>
- •8 Работа с файлами
- •8.1 Класс File
- •8.2 Работа с файлами как с потоками
- •8.2.1 Класс FileStream
- •8.2.2 Класс StreamReader
- •8.2.3 Класс StreamWriter
- •8.2.4 Класс BinaryReader
- •8.2.5 Класс BinaryWriter
3 Классы. Основные понятия
Класс представляет собой тип, содержащий данные, а также методы, позволяющие оперировать этими данными. Все элементы, входящие в класс будем называть
членами класса.
Для каждого объекта класса создаётся своя копия членов-данных, в то время, как члены-методы являются общими для всех объектов.
3.1 Общая схема
Общая схема определения класса имеет вид:
[<доступ>] class <идентификатор класса> [: <идентификатор классародителя>]
{
<члены класса>
}
где:
<доступ> – спецификатор доступа и/или модификаторы;
<идентификатор класса> – идентификатор создаваемого класса;
<идентификатор класса-родителя> – идентификатор класса, от которого наследует свойства и поведение создаваемый класс;
<члены класса> – поля, методы, свойства и другие структурные единицы класса.
3.2 Спецификаторы доступа
При объявлении класса или члена класса могут указываться ключевые слова, определяющие тип доступа к ним (спецификаторы доступа):
public – доступен без каких-либо ограничений;
protected – доступен внутри тела класса, а также для потомков класса;
internal – доступен только внутри файлов одной и той же сборки. Внутренний доступ чаще всего используется в разработке на основе компонентов, так как он позволяет группе компонентов взаимодействовать в закрытой форме, не открывая доступ остальной части кода приложения;
protected internal – комбинация доступа protected и internal;
private – доступен только внутри тела класса, в котором он объявлен.
По умолчанию (т.е. если нет явного указания), члены класса имеют доступ private, а классы – internal;
Спецификаторы доступа protected и private не могут применяться к классам верхнего уровня, т.е. классам, не входящим в состав других классов.
47
Поля класса объявляются, как правило, с помощью спецификаторов доступа protected и private, т.к. доступ к данным класса извне реализуется с помощью свойств, методов или индексаторов. Использование для доступа к полям спецификатора public снижает надёжность программы1.
3.3 Поля
Поле по своей сути представляет обычную переменную некоторого типа, для которой задан спецификатор доступа. Формальная схема описания полей имеет вид:
[<доступ>] <тип> <идентификатор 1>[=<значение идентификатора 1>][, <идентификатор2>[=<значение идентификатора 2>] ...];
Примеры:
private double d; protected int a, b=10;
Начальное значение поля может быть задано через конструктор класса, при этом порядок задания начальных значений следующий:
присвоение полю значения по умолчанию для его типа;
присвоение значения инициализации, заданного при объявлении поля;
присвоение значения, указанного в конструкторе.
3.4 Создание объекта и доступ к его членам
В качестве начального примера работы с классами возьмём класс, описанный следующим образом:
class Figure
{
public |
string sType; // |
строковое представление типа фигуры |
public |
int posX, posY; // |
координаты фигуры |
}
Объявление переменной, которая может ссылаться на экземпляр некоторого класса (объект) выполняется обычным для переменных способом, например:
Figure firstFigure;
Классы являются ссылочным типом, поэтому перед использованием переменных данного типа требуется либо задание ссылки на существующий объект, либо созданием объекта путём использования оператора new совместно с вызовом специального метода – конструктора класса, Простейший конструктор (конструктор по
1 В приводимых в конспекте примерах для уменьшения объёма кода и простоты изложения использование полей со спецификатором доступа public будем считать допустимым.
48