- •Вопрос 1. Общее понятие ооп
- •Вопрос 2. Классы, объекты, абстрагирование
- •Вопрос 3. Полиморфизм, инкапсуляция, наследование
- •Вопрос4. История развития и базовый синтаксис с#
- •Вопрос 5. Основные черты языка с#
- •Перечисления
- •Вопрос 6. Система типов с#
- •Вопрос 7. Литералы, переменные, константы, перечисления Литералы. Представление значений
- •Переменные элементарных типов. Объявление и инициализация
- •Константы
- •Вопрос 8. Операции и выражения
- •Приоритет операций
- •Вопрос 9. Приведение типов
- •Вопрос 10 Контроль за перевыполнением
- •Вопрос 11 Процедурные и функциональные методы в с#
- •Вопрос 11 Создание и уничтожение объектов
- •Модификатор static и объект this Кроме выше рассмотренных модификаторов доступа (public,protected…) в языке c# существует еще ряд модификаторов. Один из них – модификатор static.
- •Уничтожение объектов в управляемой памяти. Деструктор
- •Вопрос 13 Параметризованные классы и индексаторы
- •Параметризованные классы – классы, позволяющие определить тип своих аргументов при непосредственном создании объектов.
- •Вопрос 14 управляющие операторы
- •Вопрос 15 массивы
- •Вопрос 16 перегрузка операций
- •Вопрос 17 Наследование. Конструкторы базового и производного классов
- •Вопрос 18 Переопределение членов базового класса:new модификатор
- •Вопрос 19 Прекращение наследования: sealed-спецификатор
- •Вопрос 20 Абстрактные функции и абстрактные классы
- •Вопрос 21 Операции is и as
- •Вопрос 22 Ввод и вывод данных с#
- •Потоки: байтовые, символьные, двоичные
- •Консольный ввод/вывод. Функции – члены класса Console
- •Консольный вывод. Форматирование
- •Нестандартное (custom) форматирование значений
- •Консольный ввод. Преобразование значений
Вопрос 8. Операции и выражения
Для каждого определенного в C# типа существует собственный набор операций, определенных на множестве значений этого типа.
Эти операции задают диапазон возможных преобразований, которые могут быть осуществлены над элементами множеств значений типа. Несмотря на специфику разных типов, в C# существует общее основание для классификации соответствующих множеств операций. Каждая операция является членом определенного подмножества операций и имеет собственное графическое представление.
Общие характеристики используемых в C# операций представлены ниже.
Arithmetic |
+ – * / % |
Логические (boolean и побитовые) |
& | ^ ! ~ && || |
Строковые (конкатенаторы) |
+ |
Increment, decrement |
++ –– |
Сдвига |
>> << |
Сравнения |
== != < > <= >= |
Присвоения |
= += –= *= /= %= &= |= ^= <<= >>= |
Member access |
. |
Индексации |
[] |
Cast (приведение типа) |
() |
Conditional (трехоперандная) |
?: |
Delegate concatenation and removal |
+ – |
Создания объекта |
new() |
Type information |
is sizeof typeof |
Overflow exception control (управление исключениями) |
checked unchecked |
Indirection and Address (неуправляемый код) |
* –> [] & |
На основе элементарных (первичных) выражений с использованием этих самых операций и дополнительных разделителей в виде открывающихся и закрывающихся скобочек формируются выражения все более сложной структуры. Кроме того, при создании, трансляции, а главное, на стадии выполнения (определения значения выражения) учитываются следующие обстоятельства:
приоритет операций,
типы операндов и приведение типов.
Приоритет операций
1 |
() [] . (постфикс)++ (постфикс)–– new sizeof typeof unchecked |
2 |
! ~ (имя типа) +(унарный) –(унарный) ++(префикс) ––(префикс) |
3 |
* / % |
4 |
+ – |
5 |
<< >> |
6 |
< > <= => is |
7 |
== != |
8 |
& |
9 |
^ |
10 |
| |
11 |
&& |
12 |
|| |
13 |
?: |
14 |
= += –= *= /= %= &= |= ^= <<= >>= |
Вопрос 9. Приведение типов
Приведение типов – один из аспектов безопасности языка.
Используемые в программе типы характеризуются собственными диапазонами значений, которые определяются свойствами типов – в том числе и размером области памяти, предназначенной для кодирования значений соответствующего типа. При этом области значений различных типов пересекаются. Многие значения можно выразить более чем одним типом. Например, значение 4 можно представить как значение типа sbyte, byte, short, ushort, int, uint, long, ulong. При этом в программе все должно быть устроено таким образом, чтобы логика преобразования значений одного типа к другому типу была бы понятной, а результаты этих преобразований – предсказуемы. В одном выражении могут быть сгруппированы операнды различных типов. Однако возможность подобного "смешения" при определении значения выражения приводит к необходимости применения дополнительных усилий по приведению значений операндов к "общему типу".
Иногда приведение значения к другому типу происходит автоматически. Такие преобразования называются неявными.
Но в ряде случаев преобразование требует дополнительного внимания со стороны программиста, который должен явным образом указывать необходимость преобразования, используя выражения приведения типа или обращаясь к специальным методам преобразования, определенным в классе System.Convert, которые обеспечивают преобразование значения одного типа к значению другого (в том числе значения строкового типа к значениям базовых типов).
Преобразование типа создает значение нового типа, эквивалентное значению старого типа, однако при этом не обязательно сохраняется идентичность (или точные значения) двух объектов.
Различаются:
Расширяющее преобразование – значение одного типа преобразуется к значению другого типа, которое имеет такой же или больший размер. Например, значение, представленное в виде 32-разрядного целого числа со знаком, может быть преобразовано в 64-разрядное целое число со знаком. Расширяющее преобразование считается безопасным, поскольку исходная информация при таком преобразовании не искажается.
Byte |
UInt16, Int16, UInt32, Int32, UInt64, Int64, Single, Double, Decimal |
SByte |
Int16, Int32, Int64, Single, Double, Decimal |
Int16 |
Int32, Int64, Single, Double, Decimal |
UInt16 |
UInt32, Int32, UInt64, Int64, Single, Double, Decimal |
Char |
UInt16, UInt32, Int32, UInt64, Int64, Single, Double, Decimal |
Int32 |
Int64, Double, Decimal |
UInt32 |
Int64, Double, Decimal |
Int64 |
Decimal |
UInt64 |
Decimal |
Single |
Double |
Некоторые расширяющие преобразования типа могут привести к потере точности. Следующая таблица описывает варианты преобразований, которые иногда приводят к потере информации.
Int32 |
Single |
UInt32 |
Single |
Int64 |
Single, Double |
UInt64 |
Single, Double |
Decimal |
Single, Double |
Сужающее преобразование – значение одного типа преобразуется к значению другого типа, которое имеет меньший размер (из 64-разрядного в 32-разрядное). Такое преобразование потенциально опасно потерей значения.
Сужающие преобразования могут приводить к потере информации. Если тип, к которому осуществляется преобразование, не может правильно передать значение источника, то результат преобразования оказывается равен константе PositiveInfinity или NegativeInfinity.
При этом значение PositiveInfinity интерпретируется как результат деления положительного числа на ноль, а значение NegativeInfinity — как результат деления отрицательного числа на ноль.
