- •Тема 6. Основы программирования на языке c#
- •Условная операция
- •Операции checked и unchecked
- •Операция поглощения null
- •Безопасность типов
- •Преобразования типов
- •Неявные преобразования
- •Явные преобразования
- •Проверка равенства объектов
- •Упаковка и распаковка
- •Виртуальный метод Equals()
- •Статический метод Equals()
- •Проверка типов значений на равенство
- •Перегрузка операций
- •Как работают операции
- •Пример перегрузки операции: структура Vector
- •Добавление дополнительных перегрузок
- •Перегрузка операций сравнения
- •Пользовательские приведения
- •Реализация пользовательских приведений
- •Приведение между классами
- •Приведение между базовым и производным классами
- •Упаковывающие и распаковывающие приведения
- •Множественные приведения
Операция поглощения null
Операция поглощения null (??) представляет собой сокращенный механизм, обеспечивающий возможность работы с null-значениями в выражениях, включающих ссылочные типы и типы, которые допускают null. Операция размещается между двумя операндами — первый должен иметь тип, допускающий null-значения, или ссылочный, а второй должен быть того же типа, что и первый, либо типа, неявно преобразуемого к типу первого операнда.
Операция поглощения null работает следующим образом:
если первый операнд не равен null, то все выражение принимает значение первого операнда;
если первый операнд равен null, все выражение принимает значение второго операнда.
Например:
int? а = null;
int b;
b = a ?? 10; // b имеет значение 10
a = 3;
b = a ?? 10; //b имеет значение 3
Если второй операнд не может быть неявно преобразован к типу первого операнда, генерируется ошибка компиляции.
Приоритеты операций
В табл. 7.4 представлены приоритеты операций С#. Операции, указанные в верхней части таблицы, имеют наивысший приоритет (т.е. вычисляются первыми в выражении, содержащем множество операций).
Таблица 7.4. Приоритеты операций C#
Группа |
Операции |
Первичные |
().[] x++ x-- new typeof sizeof checked unchecked |
Унарные |
+ - ! ~ ++x -x приведения |
Умножения/деления |
/ * % |
Сложения/вычитания |
+ - |
Побитового сдвига |
<< >> |
Отношения |
<= >= <> is as |
Сравнения |
== != |
Битовое «И» |
& |
Битовое исключающее «ИЛИ» |
^ |
Битовое «ИЛИ» |
| |
Логическое «И» |
&& |
Логическое «ИЛИ» |
|| |
Тернарная операция |
? : |
Присваивания |
= += -= *= .= %= &= |= ^= <<= >>= >>>= |
В сложных выражениях для получения корректного результата не следует слишком полагаться на приоритеты операций. Применение скобок для указания порядка вычисления операций проясняет код и позволяет избежать возможной путаницы.
Безопасность типов
В разделе 6.1 отмечалось, что промежуточный язык (IL) поддерживает строгую безопасность типов в коде. Строгая типизация обеспечивает работу многих служб, представляемых .NET, включая безопасность и межъязыковое взаимодействие. Как и следовало ожидать от языка, компилируемого в IL, C# также является строго типизированным. Помимо прочего, это означает, что типы данных не всегда являются гладко взаимозаменяемыми. В этом разделе речь пойдет о преобразованиях между примитивными типами.
Язык C# также поддерживает преобразование между разными ссылочными типами и всегда позволяет определить, как создаваемые вами типы данных ведут себя при преобразовании в другие типы и обратно. Обе эти темы обсуждаются далее в настоящей главе. С другой стороны, обобщения (generics) позволяют избежать некоторых наиболее часто встречающихся ситуаций, когда может понадобиться преобразование типов. Подробности ищите.в главах 5 и 10.
