Скачиваний:
3
Добавлен:
04.09.2023
Размер:
1.48 Mб
Скачать

namespace Common

{

class ReportBase {}

}

namespace ManagementReporting

{

class SalesReport : Common.ReportBase {} // Частично уточненное

имя

}

}

Сокрытие имен: Если внутреннее и внешнее пространства имен содержат объявление типов с одинаковыми именами, то при использовании во внутреннем пространстве имен предпочтение будет отдано внутреннему типу.

Чтобы сослаться на тип из внешнего пространства, необходимо использовать полное уточненное имя.

9 Операторы. Основные языка С#. Арифметические и логические

операторы. Бинарные и унарные операторы. Составные операторы.

Понятие перегрузки операторов.

Оператор – встроенный в язык способ взаимодействия переменных.

Основные операторы (Здесь речь либо про перечисление типов, либо про отдельную и очень условную категорию. Если первый вариант, что более вероятно, то всё это представлено в заголовке вопроса. Если второй вариант,

что менее вероятно, но упомяну на всякий случай, то можно сказать, что есть отдельная очень условная категория, которая по порядку выполнения операций стоит самой первой. К примеру, обращение к элементу массива типа a[i], операции автоинкремента ++ или использование тега new при

переопределении значения переменной будет основным оператором. Их там много, но достаточно знать, что любое обращение к переменным внутри переменных, операции авто+ и авто- и использование тегов при определении переменной будет в большинстве случаев основным оператором.):

Арифметические – операторы стандартных математических операций с числовыми и другими переменными. + – сложение, - – вычитание,

* – умножение, / – деление, % – деление по модулю, ++ – инкремент, -- –

декремент.

Логические и условные – операторы для работы с переменными типа bool. & – И, | – ИЛИ, ^ – исключающее ИЛИ, ! – НЕ, && – укороченное

Идля условных конструкций, || – укороченное ИЛИ для условных конструкций, ==/!=/>/</>=/<= – все операторы сравнения для условных конструкций.

Унарные – операторы для действий с одной переменной. +/- –

присвоение переменной знака +/-, ++/-- – инкремент и декремент, ! – НЕ.

Бинарные – операторы для действий с двумя переменными. Все другие операторы, которые не являются унарными, например, + как сложение двух переменных.

Составные операторы – операторы укороченной записи,

представляемые как аналог арифметической или логической операции с переменной и единицей. +=/-=/*=//= – арифметические операции типа

(х = х знак 1), |= – логическое ИЛИ с 1, ^= – логическое исключающее ИЛИ с 1, op= логическое присваивание типа (х = х op у).

Перегрузка операторов – доступный для ряда операторов способ определения действий при возникновении в коде выбранного оператора. Если проще, то перегрузка операторов нужна для того, чтобы реализовывать ситуации типа (массив1 + массив2 = поэлементная сумма элементов массива).

Если нужно сделать так, чтобы использование определённого оператора выполняло какие-то нестандартные для этого оператора действия, можно перегрузить переменную и получить перегрузку. При выполнении операций

сначала проверяются пользовательские перегрузки, а при их отсутствии

используются стандартные инструкции по выполнению операций.

10 Выражения. Приоритет и ассоциативность операторов. Порядок

вычисления выражения.

Комбинации операндов (переменных) и операций составляются в выражения. У разных операций будет разный порядок выполнения, что будет определяться двумя понятиями:

Приоритет – показатель, в соответствии с которым определяется порядок выполнения операций разного приоритета в выражении. Чем выше приоритет операции, тем раньше она производится в выражении. К примеру,

умножение имеет более высокий приоритет, чем сложение, поэтому в выражении с этими двумя операторами в первую очередь будет произведено умножение, а потом сложение. Есть отдельная таблица с приоритетами для всех операций. В самом верху таблицы находятся операции типа выбора элемента из массива, а в самом её низу находятся условные операции и,

упоминаемые только в том случае, если вы знаете, что это такое, операции для работы с лямбда-выражениями.

Ассоциативность – показатель, определяющий порядок выполнения операций с одинаковым приоритетом. Левая ассоциативность – выполнение операций слева направо, характерна почти для всех операций.

Правая ассоциативность – выполнение операций справа налево, характерна только для операторов присвоения (х = у = а имеет вид х = (у = а)), оператора объединения со значением null (?? и ??= для возвращения операнда, если его значение не null), лямбда-выражения и условные операторы ?: (ставится после логического выражения с выбором из двух выходов для выполнения и невыполнения условия).

Стоит ещё указать, что помимо этих двух параметров порядок выполнения операций определяется наличием или отсутствием в выражении

скобок. При ограничении выражения в скобки ограниченная скобками часть будет выполняться первой, обходя приоритет операторов.

Операнды (переменные) в выражении тоже имеют порядок, по которому они определяются. Операнды определяются самыми первыми слева направо по порядку выполнения операций. При появлении скобок операнды определяются слева направо до этих скобок, после чего определяются операнды внутри скобок, выполняются операции внутри скобок, а затем

продолжается определение операндов.

Для примера порядок выполнения операций:

Выражение

Порядок

 

 

+

, , +

 

 

+

, , , , +

 

 

/ +

, ,/, , , , +

 

 

/( + )

, , , +,/, ,

 

 

11 Преобразования типов. Иерархия численных типов. Явное и неявное преобразование типов. Возможные ошибки.

Явное и неявное преобразование типов. Возможные ошибки.

Поскольку код C# является статически типизированным во время компиляции, после объявления переменной ее нельзя объявить повторно или назначить ей значения другого типа, если этот тип невозможно неявно преобразовать в тип переменной. Например, string невозможно неявно преобразовать в int. Поэтому после объявления i как int нельзя назначить ей строку "Hello", как показано в следующем коде:

Тем не менее иногда может потребоваться скопировать значение в переменную или параметр метода другого типа. Например, может потребоваться передать целочисленную переменную в метод, параметр которого имеет тип double. Или может понадобиться присвоить переменную класса переменной типа интерфейса. Такого рода операции называются преобразованиями типа. В C# можно выполнять следующие виды преобразований.

Неявные преобразования. Специальный синтаксис не требуется,

так как преобразование всегда завершается успешно и данные не будут потеряны. Примеры включают преобразования из меньших в большие целочисленные типы и преобразования из производных классов в базовые классы.

В случае с расширяющими преобразованиями компилятор за нас выполнял все преобразования данных, то есть преобразования были неявными

(implicit conversion). Такие преобразования не вызывают каких-то затруднений. Тем не менее стоит сказать пару слов об общей механике подобных преобразований.

Если производится преобразование от безнакового типа меньшей разрядности к безнаковому типу большой разрядности, то добавляются дополнительные биты, которые имеют значени 0. Это называется дополнение нулями или zero extension.

1

byte a = 4;

// 0000100

2

ushort b = a;

// 000000000000100

Если производится преобразование к знаковому типу, то битовое представление дополняется нулями, если число положительное, и единицами,

если число отрицательное. Последний разряд числа содержит знаковый бит -

0 для положительных и 1 для отрицательных чисел. При расширении в добавленные разряды компируется знаковый бит.

Рассмотрим преобразование положительного числа:

1

sbyte a = 4;

// 0000100

2

short b = a;

// 00000000000010

Преобразование отрицательного числа:

1

sbyte a = -4;

// 1111100

2

short b = a;

// 111111111111100

Явные преобразования (приведения). Для явных преобразований требуется выражение приведения. Приведение требуется, если в ходе преобразования данные могут быть утрачены или преобразование может завершиться сбоем по другим причинам. Типичными примерами являются числовое преобразование в тип с меньшей точностью или меньшим диапазоном и преобразование экземпляра базового класса в производный класс.

Иерархия численных типов.

В C# определены девять целочисленных типов: char, byte, sbyte, short, ushort, int, uint, long и ulong. Но тип char применяется, главным образом, для представления символов и поэтому рассматривается отдельно. Остальные восемь целочисленных типов предназначены для числовых расчетов. Ниже представлены их диапазон представления чисел и разрядность в битах:

Простые численные: sbytе, byte, short, ushort, int, uint, long, ulong, char,

float, double, bool, decimal

Интегральные типы. C # поддерживает девять целочисленных типов: sbyte, byte, short, ushort, int, uint, long, ulong, и char.

C # поддерживает два типа с плавающей запятой: floatи double.

Десятичный тип decimal.

Тип Bool представляет булевы логические величины. Возможные значения типа boolявляются trueи false.

Тип перечисления – это отдельный тип с именованными константами.

Каждый тип перечисления имеет базовый тип, который должен быть byte, sbyte, short, ushort, int, uint, longили ulong.

Обнуляемые типы. Тип, допускающий значение NULL, может представлять все значения своего базового типа плюс дополнительное значение NULL. Записывается тип, допускающий значение NULL T, где T-

базовый тип.

12 Тема: Модификаторы доступа языка C#. Необходимые знания:

Назначение и функции модификаторов private, public, protected, internal, protected internal, private protected.

Модификаторы доступа определяют область видимости как непосредственно самого класса, так и его составляющих (поля, свойства,

методы). С помощью этих модификаторов можно задать следующие шесть уровней доступа:

public: неограниченный доступ;

protected: доступ ограничен содержащим классом или типами,

которые являются производными от содержащего класса;

internal: доступ ограничен текущей сборкой;

protected internal: доступ ограничен текущей сборкой или типами,

которые являются производными от содержащего класса;

private: доступ ограничен содержащим типом;

private protected: доступ ограничен содержащим классом или типами, которые являются производными от содержащего класса в текущей сборке.

Если для компонентов не определен модификатор доступа, то по умолчанию для них применяется модификатор private. Классы и структуры,

которые объявлены без модификатора и которые расположены вне других типов, по умолчанию имеют доступ internal, а вложенные классы и структуры,

как и остальные компоненты классов/структур имеют модификатор private.

Как правило, уровень доступности члена не может быть выше уровня доступности типа, в который он входит (принцип наследования).

13 Выбор вариантов.

Условный оператор (if, if else). Оператор множественного выбора

(switch).

Оператор if выбирает оператор, который нужно выполнить, на основе значения логического выражения.

Оператор if с частью else выбирает для выполнения один из двух операторов на основе значения логического выражения, как показано в следующем примере:

if (Условие)

{

Оператор1(); // Выполняется если Условие = True

}

else

{

Оператор2(); // Выполняется если Условие = False

}

Оператор switch выбирает список операторов, который нужно

выполнить, на основе соответствия переменной выражению.

switch (Переменная)

{

Переменная < 0.0: Оператор1(); break;

Переменная > 10.0: Оператор2();