Язык программирования C#
©Павловская Т.А. (СПбГУ ИТМО) 1
Введение
©Павловская Т.А. (СПбГУ ИТМО) 2
Основные критерии качества программы
надежность
возможность точно планировать производство и
сопровождение
Для достижения этих целей программа должна:
иметь простую структуру
быть хорошо читаемой
быть легко модифицируемой
©Павловская Т.А. (СПбГУ ИТМО) 3
Парадигмы программирования
Парадигма — способ организации программы, принцип ее
построения. Наиболее распространенными являются
процедурная и объектно-ориентированная парадигмы.
Они различаются способом декомпозиции, положенным
в основу при создании программы.
Процедурная декомпозиция состоит в том, что задача,
реализуемая программой, делится на подзадачи, а они, в
свою очередь — на более мелкие этапы, то есть
выполняется пошаговая детализация алгоритма решения
задачи.
Объектно-ориентированная декомпозиция предполагает
разбиение предметной области на объекты и реализацию
этих объектов и их взаимосвязей в виде программы.
Кроме того, существуют функциональная и логическая
©Павловская Т.А. (СПбГУ ИТМО) 4
Первый взгляд на классы
Понятие класс аналогично обыденному смыслу этого
слова в контексте «класс членистоногих», «класс задач».
Класс является обобщенным понятием, определяющим
характеристики и поведение некоторого множества
конкретных объектов этого класса, называемых
экземплярами класса (объектами).
Класс содержит данные, задающие свойства объектов
класса, и функции (методы), определяющие их поведение.
Все классы .NET имеют одного общего предка — класс
object, и организованы в единую иерархическую структуру.
Классы логически сгруппированы в так называемые
пространства имен, которые служат для упорядочивания
имен классов и предотвращения их конфликтов: в разных
пространствах имена могут совпадать. Пространства имен
могут быть вложенными
©Павловская Т.А. (СПбГУ ИТМО) 5
Трансляция
Компиляция Интерпретация
Исходный Программа
Компилятор, Выполнение
текст на машинном
компоновщик программы
программы языке
Оператор на Команды на
исходном Интерпре- машинном Выполнение
языке татор языке команд
©Павловская Т.А. (СПбГУ ИТМО) 6
Гибридная схема трансляции
Исходный Программа на
текст Компилятор промежуточном
программы языке
Исполняющая
система
©Павловская Т.А. (СПбГУ ИТМО) 7
Схема выполнения программы в .NET
Сборка (.exe или .DLL)
Исходный Исполняемый
текст Компилятор файл (IL и
программы метаданные)
CLR
Базовые классы Загрузчик классов
среды (IL и
метаданные) JIT-компилятор
Исполняемый код Вызовы
(маш. команды) нескомпили-
рованных
методов
Выполнение
программы
©Павловская Т.А. (СПбГУ ИТМО) 8
Основные понятия языка
Состав языка
©Павловская Т.А. (СПбГУ ИТМО) 9
Состав языка
Символы:
буквы: A-Z, a-z, _, буквы нац.
алфавитов
цифры: 0-9, A-F
спец. символы: +, *, {, …
пробельные символы
Лексемы:
константы 2 0.11 “Вася”
имена Vasia a _11
ключевые слова double do if
знаки операций + - =
разделители ; [] ,
Выражения
выражение - правило вычисления значения: a + b
Операторы
исполняемые: c = a + b;
описания: double a, b;
©Павловская Т.А. (СПбГУ ИТМО) 10
Константы (литералы) C#
Вид Примеры
Булевские true false
Целые дес. 8 199226 0Lu
шестн. 0xA 0x1B8 0X00FFL
Веществ. с тчк 5.7 .001f 35m
с порядком 0.2E6 .11e–3 5E10
Символьные 'A' '\x74' '\0' '\uA81B'
Строковые "Здесь был Vasia"
"\tЗначение r=\xF5\n"
"Здесь был \u0056\u0061"
@"C:\temp\[Link]"
Константа null null
©Павловская Т.А. (СПбГУ ИТМО) 11
Имена (идентификаторы)
имя должно начинаться с буквы или _;
имя должно содержать только буквы, знак
подчеркивания и цифры;
прописные и строчные буквы различаются;
длина имени практически не ограничена.
имена не должны совпадать с ключевыми словами,
однако допускается: @if, @float…
в именах можно использовать управляющие
последовательности Unicode
Примеры правильных имен:
Vasia, Вася, _13, \u00F2\u01DD, @while.
Примеры неправильных имен:
2late, Big gig, Б#г
©Павловская Т.А. (СПбГУ ИТМО) 12
Нотации
Понятные и согласованные между собой имена —
основа хорошего стиля. Существует несколько
нотаций — соглашений о правилах создания имен.
В C# для именования различных видов программных
объектов чаще всего используются две нотации:
НотацияПаскаля - каждое слово начинается с
прописной буквы:
MaxLength, MyFuzzyShooshpanchik
Camel notation - с прописной буквы начинается
каждое слово, составляющее идентификатор, кроме
первого:
maxLength, myFuzzyShooshpanchik
©Павловская Т.А. (СПбГУ ИТМО) 13
Ключевые слова, знаки операций, разделители
Ключевые слова — идентификаторы, имеющие специальное
значение для компилятора. Их можно использовать только в
том смысле, в котором они определены.
Например, для оператора перехода определено слово goto.
Знак операции — один или более символов, определяющих
действие над операндами. Внутри знака операции пробелы
не допускаются.
Например, сложение +, деление /, сложное присваивание %=.
Операции делятся на унарные (с одним операндом),
бинарные (с двумя) и тернарную (с тремя).
Разделители используются для разделения или, наоборот,
группирования элементов. Примеры разделителей: скобки,
точка, запятая.
©Павловская Т.А. (СПбГУ ИТМО) 14
Ключевые слова C#
abstract as base bool break byte case
catch char checked class const continue
decimal default delegate do double
else enum event explicit extern
false finally fixed float for foreach
goto if implicit in int interface
internal is lock long namespace new
null object operator out override
params private protected public
readonly ref return sbyte sealed
short sizeof stackalloc static string
struct switch this throw true
try typeof uint ulong unchecked
unsafe ushort using virtual void
volatile while
©Павловская Т.А. (СПбГУ ИТМО) 15
Типы данных
©Павловская Т.А. (СПбГУ ИТМО) 16
Концепция типа данных
Тип данных определяет:
внутреннее представление данных =>
множество их возможных значений
допустимые действия над данными =>
операции и функции
©Павловская Т.А. (СПбГУ ИТМО) 17
Различные классификации типов данных
Типы
данных Типы
данных
Простые Структуриро
Определяемые
ванные Встроенные программистом
Типы
данных
Статические Динамические
©Павловская Т.А. (СПбГУ ИТМО) 18
Основная классификация типов C#
Типы данных
Тип void Указатели
Значения Ссылочные
Перечисления
Структурные object
типы Массивы
Строки string
Классы
Интерфейсы
Булевский Типы nullable Делегаты
Целые
Вещественные
Финансовый
Структуры
Символьный
©Павловская Т.А. (СПбГУ ИТМО) 19
Хранение в памяти величин значимого и
ссылочного типа
Хип
Значение Значение
Стек
Значение Значение Ссылка Ссылка Ссылка
а b c
x y
Тип-значение Ссылочный
тип
©Павловская Т.А. (СПбГУ ИТМО) 20
Встроенные типы данных C#
©Павловская Т.А. (СПбГУ ИТМО) 21
Логический и целые
Название Ключево Тип .NET Диапазон значений Описание Размер
е ,
слово бит
Булевский bool Boolean true, false
Целые sbyte SByte –128 — 127 знаковое 8
byte Byte 0 — 255 беззнаковое 8
short Int16 –32768 —32767 знаковое 16
ushort UInt16 0 — 65535 беззнаковое 16
int Int32 ≈(–2109 — 2109) знаковое 32
uint UInt32 ≈(0 — 4109) беззнаковое 32
long Int64 ≈(–91018 — 91018) знаковое 64
ulong UInt64 ≈(0— 181018) беззнаковое 64
©Павловская Т.А. (СПбГУ ИТМО) 22
Остальные
Название Ключевое Тип .NET Диапазон значений Описание Размер
слово ,
бит
Символьный char Char U+0000 — U+ffff символ 16
Unicode
Веществен- float Single 1.510-45 — 3.41038 7 цифр 32
ные
double Double 5.010-324 — 1.710308 15-16 цифр 64
Финансовый decim Decimal 1.010-28 — 7.91028 28-29 цифр 128
al
Строковый string String длина ограничена строка из
объемом символов
доступной памяти Unicode
object object Object можно хранить все, всеобщий
что угодно предок
©Павловская Т.А. (СПбГУ ИТМО) 23
Поля и методы встроенных типов
Любой встроенный тип C# построен на основе
стандартного класса библиотеки .NET. Это значит, что
у встроенных типов данных C# есть методы и поля. С
помощью них можно, например, получить:
[Link] (или [Link]) —
максимальное число типа double;
[Link] (или [Link]) — минимальное
число типа uint.
В вещественных классах есть элементы:
положительная бесконечность PositiveInfinity;
отрицательная бесконечность NegativeInfinity;
«не является числом»: NaN.
©Павловская Т.А. (СПбГУ ИТМО) 24
Математические функции: класс Math
Имя Описание Результат Пояснения
Abs Модуль перегружен |x| записывается как Abs(x)
Acos Арккосинус double Acos(double x)
Asin Арксинус double Asin(double x)
Atan Арктангенс double Atan(double x)
Atan2(double x, double y)—
Atan2 Арктангенс double угол, тангенс которого есть
результат деления y на x
BigMul Произведение long BigMul(int x, int y)
Округление до
Ceiling double Ceiling(double х)
большего целого
Cos Косинус double Сos(double x)
Гиперболический
Cosh double Cosh(double x)
косинус
DivRem Деление и остаток перегружен DivRem(x, y, rem)
База натурального
E логарифма (число double 2,71828182845905
е)
Exp Экспонента double ex записывается как Exp(x)
©Павловская Т.А. (СПбГУ ИТМО) 25
Округление до
Floor double Floor(double х)
меньшего целого
IEEERemain IEEERemainder(double x, double
Остаток от деления double
der y)
Натуральный logex записывается как Log(x)
Log double
логарифм
Десятичный log10x записывается как Log10(x)
Log10 double
логарифм
Максимум из двух
Max перегружен Max(x, y)
чисел
Минимум из двух
Min перегружен Min(x, y)
чисел
PI Значение числа π double 3,14159265358979
Pow Возведение в степень double xy записывается как Pow(x, y)
Round(3.1) даст в результате 3 Round
Round Округление перегружен
(3.8) даст в результате 4
Sign Знак числа int аргументы перегружены
Sin Синус double Sin(double x)
гиперболический
Sinh double Sinh(double x)
синус
Sqrt Квадратный корень double √x записывается как Sqrt(x)
Tan Тангенс double Tan(double x)
Гиперболический
Tanh double Tanh(double x) 26
©Павловская Т.А. (СПбГУ ИТМО) тангенс
Линейные программы
©Павловская Т.А. (СПбГУ ИТМО) 27
Структура простейшей программы на С#
using System;
namespace A
{
class Class1
{
static void Main()
{
// описания и операторы
}
// описания
}
}
©Павловская Т.А. (СПбГУ ИТМО) 28
Переменные
Переменная — это величина, которая во время
работы программы может изменять свое значение.
Все переменные, используемые в программе,
должны быть описаны.
Для каждой переменной задается ее имя и тип:
int number;
float x, y;
char option;
Тип переменной выбирается исходя из диапазона и
требуемой точности представления данных.
©Павловская Т.А. (СПбГУ ИТМО) 29
Общая структура программы на С#
пространство имен
Класс А
Переменные класса
Методы класса:
Локальные переменные
…
Класс В
Переменные класса
Методы класса:
Метод Main
©Павловская Т.А. (СПбГУ ИТМО) 30
Область действия и время жизни переменных
Переменные описываются внутри какого-л. блока
(класса, метода или блока внутри метода)
Блок — это код, заключенный в фигурные скобки. Основное
назначение блока — группировка операторов.
Переменные, описанные непосредственно внутри класса,
называются полями класса.
Переменные, описанные внутри метода класса, называются
локальными переменными.
Область действия переменной - область программы, где
можно использовать переменную.
Область действия переменной начинается в точке ее
описания и длится до конца блока, внутри которого она
описана.
Время жизни: переменные создаются при входе в их
область действия (блок) и уничтожаются при выходе.
©Павловская Т.А. (СПбГУ ИТМО) 31
Инициализация переменных
При объявлении можно присвоить переменной начальное
значение (инициализировать).
int number = 100;
float x = 0.02;
char option = ’ю’;
При инициализации можно использовать не только
константы, но и выражения — главное, чтобы на момент
описания они были вычислимыми, например:
int b = 1, a = 100;
int x = b * a + 25;
Поля класса инициализируются «значением по
умолчанию» (0 соответствующего типа).
Инициализация локальных переменных возлагается на
программиста. Рекомендуется всегда инициализировать
переменные при описании.
©Павловская Т.А. (СПбГУ ИТМО) 32
Пример описания переменных
using System;
namespace CA1
{ class Class1
{ static void Main()
{
int i = 3;
double y = 4.12;
decimal d = 600m;
string s = "Вася";
}
}
}
©Павловская Т.А. (СПбГУ ИТМО) 33
Именованные константы
Вместо значений констант можно (и нужно!) использовать в
программе их имена.
Это облегчает читабельность программы и внесение в нее
изменений:
const float weight = 61.5;
const int n = 10;
const float g = 9.8;
©Павловская Т.А. (СПбГУ ИТМО) 34
Выражения
Выражение — правило вычисления t + [Link](x)/2 * x
значения.
В выражении участвуют операнды, результат имеет
объединенные знаками операций. вещественный тип
Операндами выражения могут быть
константы, переменные и вызовы a <= b + 2
функций. результат имеет
Операции выполняются в логический тип
соответствии с приоритетами.
x > 0 && y < 0
Для изменения порядка выполнения
операций используются круглые результат имеет
скобки. логический тип
Результатом выражения всегда
является значение определенного
типа, который определяется типами
операндов.
Величины, участвующие в
выражении, должны быть
совместимых типов.
©Павловская Т.А. (СПбГУ ИТМО) 35
Приоритеты операций C#
1. Первичные (), [], ++, --, new, …
2. Унарные ~, !, ++, --, -, …
3. Типа умножения (мультипликативные) *, /, %
4. Типа сложения (аддитивные) +, -
5. Сдвига <<, >>
6. Отношения и проверки типа <, >, is, …
7. Проверки на равенство ==, !=
8. Поразрядные логические &, ^, |
9. Условные логические &&, ||
10. Условная ?:
11. Присваивания =, *=, /=,…
©Павловская Т.А. (СПбГУ ИТМО) 36
Тип результата выражения
Если операнды, входящие в выражение, одного типа, и
операция для этого типа определена, то результат
выражения будет иметь тот же тип.
Если операнды разного типа и (или) операция для этого
типа не определена, перед вычислениями автоматически
выполняется преобразование типа по правилам,
обеспечивающим приведение более коротких типов к
более длинным для сохранения значимости и точности.
Автоматическое (неявное) преобразование возможно не
всегда, а только если при этом не может случиться
потеря значимости.
Если неявного преобразования из одного типа в другой не
существует, программист может задать явное
преобразование типа с помощью операции (тип)x.
©Павловская Т.А. (СПбГУ ИТМО) 37
Неявные арифметические преобразования
типов в C#
double
decimal
float
long ulong
int uint
short ushort
sbyte byte char
©Павловская Т.А. (СПбГУ ИТМО) 38
Введение в исключения
При вычислении выражений могут возникнуть ошибки
(переполнение, деление на ноль).
В C# есть механизм обработки исключительных ситуаций
(исключений), который позволяет избегать аварийного
завершения программы.
Если в процессе вычислений возникла ошибка, система
сигнализирует об этом с помощью выбрасывания
(генерирования) исключения.
Каждому типу ошибки соответствует свое исключение.
Исключения являются классами, которые имеют общего
предка — класс Exception, определенный в пространстве
имен System.
Например, при делении на ноль будет выброшено
исключение DivideByZeroException, при переполнении —
исключение OverflowException.
©Павловская Т.А. (СПбГУ ИТМО) 39
Инкремент и декремент
using System;
namespace CA1
{ class C1
{ static void Main()
{ int x = 3, y = 3;
[Link]( "Значение префиксного выражения: " );
[Link]( ++x );
[Link]( "Значение х после приращения: " );
[Link]( x );
[Link]( "Значение постфиксного выражения: " );
[Link]( y++ );
[Link]( "Значение у после приращения: " );
[Link]( y );
}}}
Результат работы программы:
Значение префиксного выражения: 4
Значение х после приращения: 4
Значение постфиксного выражения: 3
Значение у после приращения: 4
©Павловская Т.А. (СПбГУ ИТМО) 40
Операция new
Операция new служит для создания нового объекта. Формат
операции:
new тип ( [ аргументы ] )
С помощью этой операции можно создавать объекты как
ссылочных, так и значимых типов, например:
object z = new object();
int i = new int(); // то же самое, что int i = 0;
©Павловская Т.А. (СПбГУ ИТМО) 41
Операции отрицания
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
sbyte a = 3, b = -63, c = 126;
bool d = true;
[Link]( -a ); // Результат -3
[Link]( -c ); // Результат -126
[Link]( !d ); // Результат false
[Link]( ~a ); // Результат -4
[Link]( ~b ); // Результат 62
[Link]( ~c ); // Результат -127
}}}
©Павловская Т.А. (СПбГУ ИТМО) 42
Явное преобразование типа
long b = 300;
int a = (int) b; // данные не теряются
byte d = (byte) a; // данные теряются
©Павловская Т.А. (СПбГУ ИТМО) 43
Умножение
Операция умножения (*) возвращает результат
перемножения двух операндов.
Стандартная операция умножения определена для типов
int, uint, long, ulong, float, double и decimal.
К величинам других типов ее можно применять, если для
них возможно неявное преобразование к этим типам. Тип
результата операции равен «наибольшему» из типов
операндов, но не менее int.
Если оба операнда целочисленные или типа decimal и
результат операции слишком велик для представления с
помощью заданного типа, генерируется исключение
[Link]
©Павловская Т.А. (СПбГУ ИТМО) 44
Результаты вещественного умножения
* +y -y +0 -0 +∞ -∞ NaN
+x +z -z +0 -0 +∞ -∞ NaN
-x -z +z -0 +0 -∞ +∞ NaN
+0 +0 -0 +0 -0 NaN NaN NaN
-0 -0 +0 -0 +0 NaN NaN NaN
+∞ +∞ -∞ NaN NaN +∞ -∞ NaN
-∞ -∞ +∞ NaN NaN -∞ +∞ NaN
NaN NaN NaN NaN NaN NaN NaN NaN
©Павловская Т.А. (СПбГУ ИТМО) 45
Пример
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
int x = 11, y = 4;
float z = 4;
[Link]( z * y ); // Результат 16
[Link]( z * 1e308 ); // Рез. "бесконечность"
[Link]( x / y ); // Результат 2
[Link]( x / z ); // Результат 2,75
[Link]( x % y ); // Результат 3
[Link]( 1e-324 / 1e-324 ); // Результат NaN
}}}
©Павловская Т.А. (СПбГУ ИТМО) 46
Операции сдвига
Операции сдвига (<< и >>) применяются к
целочисленным операндам. Они сдвигают двоичное
представление первого операнда влево или вправо
на количество двоичных разрядов, заданное вторым
операндом.
При сдвиге влево (<<) освободившиеся разряды
обнуляются. При сдвиге вправо (>>)
освободившиеся биты заполняются нулями, если
первый операнд беззнакового типа, и знаковым
разрядом в противном случае.
Стандартные операции сдвига определены для
типов int, uint, long и ulong.
©Павловская Т.А. (СПбГУ ИТМО) 47
Пример
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
byte a = 3, b = 9;
sbyte c = 9, d = -9;
[Link]( a << 1 ); // Результат 6
[Link]( a << 2 ); // Результат 12
[Link]( b >> 1 ); // Результат 4
[Link]( c >> 1 ); // Результат 4
[Link]( d >> 1 ); // Результат -5
}
}
}
©Павловская Т.А. (СПбГУ ИТМО) 48
Операции отношения и проверки на
равенство
Операции отношения (<, <=, >, >=, ==, !=) сравнивают
первый операнд со вторым.
Операнды должны быть арифметического типа.
Результат операции — логического типа, равен true или
false.
x == y -- true, если x равно y, иначе false
x != y -- true, если x не равно y, иначе false
x < y -- true, если x меньше y, иначе false
x > y -- true, если x больше y, иначе false
x <= y -- true, если x меньше или равно y, иначе false
x >= y -- true, если x больше или равно y, иначе false
©Павловская Т.А. (СПбГУ ИТМО) 49
Условные логические операции
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
[Link]( true && true ); // Результат true
[Link]( true && false ); // Результат false
[Link]( true || true ); // Результат true
[Link]( true || false ); // Результат true
}
}
}
©Павловская Т.А. (СПбГУ ИТМО) 50
Условная операция
операнд_1 ? операнд_2 : операнд_3
Первый операнд — выражение, для которого существует
неявное преобразование к логическому типу.
Если результат вычисления первого операнда равен true, то
результатом будет значение второго операнда, иначе —
третьего операнда.
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
int a = 11, b = 4;
int max = b > a ? b : a;
[Link]( max ); // Результат 11
}}}
©Павловская Т.А. (СПбГУ ИТМО) 51
Операция присваивания
Присваивание – это замена старого значения переменной на
новое. Старое значение стирается бесследно.
Операция может использоваться в программе как законченный
оператор.
переменная = выражение
x
a = b + c;
x = 1;
11.5 1+0.5
x = x + 0.5;
Правый операнд операции присваивания должен иметь неявное
преобразование к типу левого операнда, например:
вещественная переменная = целое выражение;
©Павловская Т.А. (СПбГУ ИТМО) 52
Сложное присваивание в C#
x += 0.5; соответствует x = x + 0.5;
x *= 0.5; соответствует x = x * 0.5;
a %= 3; соответствует a = a % 3;
a <<= 2; соответствует a = a << 2;
и т.п.
©Павловская Т.А. (СПбГУ ИТМО) 53
Ввод-вывод в C#
©Павловская Т.А. (СПбГУ ИТМО) 54
Вывод на консоль
using System;
namespace A
{ class Class1 Результат работы программы:
{ static void Main() 3 y = 4,12
{ d = 600 s = Вася
int i = 3;
double y = 4.12;
decimal d = 600m;
string s = "Вася";
[Link]( i );
[Link]( " y = {0} \nd = {1}", y, d );
[Link](i
[Link]( " s =+
"+" sy );= " + y);
} [Link]("d = " + d + " s = " + s );
}
}
©Павловская Т.А. (СПбГУ ИТМО) 55
Ввод с консоли
using System;
namespace A
{ class Class1
{ static void Main()
{
string s = [Link](); // ввод строки
char c = (char)[Link](); // ввод символа
[Link]();
string buf; // буфер для ввода чисел
buf = [Link]();
int i = Convert.ToInt32( buf ); // преобразование в целое
buf = [Link]();
double x = [Link]( buf ); // преобразование в вещ.
buf = [Link]();
double y = [Link]( buf ); // преобразование в вещ.
}
}
}
©Павловская Т.А. (СПбГУ ИТМО) 56
Пример: перевод температуры из F в С
using System;
namespace CA1 5
{ class Class1 C ( F 32)
{ static void Main() 9
{
[Link]( "Введите температуру по Фаренгейту" );
string buf = [Link]();
double fahr = [Link]( buf );
double cels =5.0 / 9 * (fahr - 32);
[Link]( "По Фаренгейту: {0} в градусах Цельсия: {1}",
fahr, cels );
}
}
}
©Павловская Т.А. (СПбГУ ИТМО) 57