Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория_к_экзамену_ООП.doc
Скачиваний:
7
Добавлен:
01.03.2025
Размер:
422 Кб
Скачать
☆

Вопрос 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 — как результат деления отрицательного числа на ноль.