- •Тема 6. Основы программирования на языке c#
- •Условная операция
- •Операции checked и unchecked
- •Операция поглощения null
- •Безопасность типов
- •Преобразования типов
- •Неявные преобразования
- •Явные преобразования
- •Упаковка и распаковка
- •Проверка равенства объектов
- •Виртуальный метод Equals()
- •Статический метод Equals()
- •Проверка типов значений на равенство
- •Перегрузка операций
- •Как работают операции
- •Пример перегрузки операции: структура Vector
- •Добавление дополнительных перегрузок
- •Перегрузка операций сравнения
- •Пользовательские приведения
- •Реализация пользовательских приведений
- •Приведение между классами
- •Приведение между базовым и производным классами
- •Упаковывающие и распаковывающие приведения
- •Множественные приведения
Тема 6. Основы программирования на языке c#
6.7 Операции и приведения
Операции в C#
Идея эквивалентности при работе со ссылками и типами значений
Преобразование данных между примитивными типами
Преобразование типов значений в ссылочные типы посредством
упаковки
Преобразования ссылочных типов посредством приведения
Перегрузка стандартных операций для пользовательских типов
Добавление операций приведения к пользовательским типам
В предыдущих главах была представлена большая часть материала, необходимого для того, чтобы приступить к написанию полезных программ на С#. В настоящей главе дискуссия о важнейших элементах языка завершается и иллюстрируется ряд наиболее мощных аспектов С#, которые позволяют расширять возможности языка.
Операции
Хотя большинство операций C# должны быть знакомы разработчикам на С и C++, в настоящем разделе мы представим наиболее важные из них большей частью для программистов-новичков и тех, кто переходит на C# из Visual Basic. Кроме того, мы прольем свет, на некоторые отличия в синтаксисе и семантике операций, присущие С#.
В языке C# поддерживаются операции, перечисленные в табл. 7.1.
Таблица 7.1. Операции в С#
Категория |
Операции |
Арифметические |
+ - * / % |
Логические |
& | ^ ~ && || ! |
Конкатенация строк |
+ |
Инкремент и декремент |
++ -- |
Битовый сдвиг |
<< >> |
Сравнение |
== != < > <= >= |
Присваивание |
= += -= *= /= %= &= |= ^= <<= >>= |
Доступ к члену (для объектов и структур) |
. |
Индексация (для массивов и индексов) |
[] |
Приведение |
() |
Условная (тернарная операция) |
?: |
Делегатная конкатенация и удаление (см. раздел 6.8) |
+ - |
Таблица 7.1. Операции в С#
Категория |
Операции |
Создание объектов |
new |
Информация о типе |
sizeof is typeof as |
Контроль исключения, связанного с переполнением |
checked unchecked |
Косвенное обращение и адрес |
[] |
Квалификатор псевдонима пространства имен |
:: |
Операция поглощения null |
?? |
Обратите внимание, что четыре специфических операции (sizeof, *, -> и &, описанные в табл. 7.2) доступны только в небезопасном коде (коде, минующем контроль безопасности типов С#), который мы рассмотрим в главе 13. Важно также отметить, что ключевые слова операции sizeof, используемые в ранних версиях .NET Framework 1.0 и 1.1, требовали небезопасного режима. Начиная с версии .NET Framework 2.0, это требование отменено.
Таблица 7.2. Операции, доступные только в небезопасном режиме
Категория |
Операции |
Ключевые слова операции |
sizeof (только для версий .NET Framework 1.0 и 1.1) |
Логические |
& | ^ ~ && || ! |
Одной из основных ловушек, которых нужно остерегаться при использовании операций С#, является то, что, как и во всех С-подобных языках, в C# применяются разные операции для присваивания (=) и сравнения (==). Например, следующий оператор означает пусть х будет, равно 3:
х = 3;
Теперь, если вы хотите сравнить х со значением, то должны использовать двойной знак равенства ==:
if (х ==3)
{
}
К счастью, строгие правила безопасности типов C# предотвращают очень частую ошибку в С, когда вместо сравнения в логическом операторе используется присваивание. Это значит, что следующий оператор вызовет ошибку компиляции:
if (х = 3)
{
}
Программисты на Visual Basic, привыкшие использовать амперсанд (&) для конкатенации строк, должны быть внимательны. В C# для этого служит знак плюс (+), в то время как & — битовая операция “И”, применяемая к двум целым числам. | позволяет выполнить битовое “ИЛИ” между двумя целыми. Программистам на Visual Basic также не знакома арифметическая операция взятия модуля (%). Она возвращает остаток от целочисленного деления. То есть, например, если х равно 7, то х%5 вернет 2.
Вы также будете использовать немного указателей в С#, а вместе с ними немного операций косвенного обращения. Точнее говоря, единственное место, где они используются это блоки небезопасного кода, поскольку только в них разрешены указатели С#. Указатели и небезопасный код обсуждаются в разделе 6.13.
Сокращения операций
В табл. 7.3 представлен полный список сокращенных операций присваивания, доступных в С#.
Таблица 7.3. Сокращенные операции присваивания
Сокращенная операция |
Эквивалент |
x++, ++x |
x = x + 1 |
x--, --x |
x = x – 1 |
x += y |
x = x + y |
x -= y |
x = x - y |
x *= y |
x = x * y |
x /= y |
x = x / y |
x %= y |
x = x % y |
x >>= y |
x = x >> y |
x <<= y |
x = x << y |
x &= y |
x = x & y |
x |= y |
x = x | y |
Возможно, вас удивит, почему здесь показано по два примера операций инкремента ++ и декремента . Дело в том, что размещение операции перед выражением известно как префиксная форма, а после выражения как постфиксная форма, и их поведение различается.
Операции инкремента и декремента могут служить полными выражениями и использоваться внутри других выражений. Когда они применяются сами по себе, эффект от постфиксной и префиксной версий одинаков и соответствует конструкции х = х + 1 (для ++). Когда же они участвуют в более крупных выражениях, то префиксная операция увеличит значение х перед вычислением выражения; другими словами, значение х увеличится, и в выражении будет использовано это новое значение. В противоположность этому постфиксная операция увеличивает значение х после вычисления выражения т.е. в выражении будет участвовать первоначальное значение х. В следующем примере используется инкрементная операция для демонстрации разницы между поведением префиксного и постфиксного ее вариантов:
int х = 5;
if (++х == 6) //true - х увеличивается до 6 перед проверкой условия {
Console.WriteLine("Это выполнится");
}
if (х++ == 7) //false - х увеличивается до 7 после проверки условия
{
Console.WriteLine("А это - нет");
}
Условие в первом операторе if вычисляется как true, потому что х увеличивается от 5 до 6 перед тем, как будет вычислено все выражение. Условие во втором операторе if, однако, дает false, поскольку х увеличивается до 7 только после того, как будет вычислено все выражение (пока х == 6).
Поведение префиксной и постфиксной форм --х и х-- аналогично, но при этом операнд уменьшается, а не увеличивается.
Другие сокращенные операции, такие как += и -=, требуют двух операндов и применяются для модификации значения первого из них, выполняя арифметическое, логическое или битовое действие над ним. Например, приведенные ниже две строки кода эквивалентны:
х += 5; х = х + 5;
В последующих разделах рассматриваются некоторые первичные операции и операции приведения, которые будут часто использоваться в коде С#.
