Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операции и приведения.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
200.2 Кб
Скачать

34

Тема 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;

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