Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 10
Текст из файла (страница 10)
Таким образом, если компилятор попытается скомпилировать код, где этому методу вдруг передается экземпляр типа Арр1е, он выдаст сообщение об ошибке и прекратит работу. Предположим, что метод переписан несколько иначе: оЬ)есс Соврисеьчс( оЬ)есс рагзв1, оЬ)есс рагав2 ) ( гесигп ( (ьпс) рагав1 + (ьпс) рагзв2) у 2. 0; ) Вторая версия СоврисеАчо также верна, но в этом случае исключена информация о типе.
Каждый объект и значение в С№ неявно унаследовано от яузгев. Оь) есг. Ключевое слово оь) есг в с№ является псевдонимом класса Бузгев. Оь) есс. поэтому вполне законно объявлять эти параметры с типом оЬ1есс. Хотя вторая версия метода может показаться более гибкой. она допускает разные случайности. Что если некоторый код в приложении попытается передать в Совриселчо объект типа Арр1е? Компьютер это пропустит, поскольку Арр1е наследуется от яузсев.
ОЬ) есс, как и любой другой класс. 38 Глава 3 Однако вы получите неприятный сюрприз во время выполнения, когда приложение сгенерирует исключение, сообщающее, что оно не может преобразовать экземпляр Арр1е в целое число. Метод потерпит неудачу, и если не предусмотрена обработка исключений, он прервет выполнение приложения. Вряд ли вас устроит, чтобы такое случилось в приложении, когда оно будет запущено где-то на рабочем сервере. Всезда лучше находить ошибки во время компиляции, чем во время выполнения. В этом и состоит мораль данной истории. Если вы используете первую версию Сотрцседтгс, то компилятор сообщит о том,что нелепо передавать методу экземпляр Арр1е.
И это намного лучше, чем узнать об этом от рассерженного заказчика, чей сервер электронной коммерции только что выдал сбой. Компилятор — ваш друг, так что будьте вежливы с ним и предоставляйте как можно больше информации о своих намерениях. Выражения Таблица 3.1. Приоритеты операций С№ Группа операций Вкодящие операции Описание Доступ к члену. Вызов метода. х(...) х[...] Первичные Доступ к элементу. х++, х— Постфиксныв инкреыент и декрвывнт. сен Т(...), пеи Т[...) Выражения создания. Суреог (Т) Получение объекта з уз сеяг. Туре для Т.
Создание объектов и массивов Вычисление выражения в управляемой и неуправляемой среде. с)геснег((х), сос)гесйег((х) Производитзначвние поумоя- чвнию для типа Т ' г(егац1С(Т) с(е1едзте (... ) Анонимная функция/метод Идентичность и отрицание. +х, -х Логическое отрицание. Двоичное отрицание.
!х Унзрные Првфиксныв инкреыент и декрвмвнт. ++х, — х Операция приведения. (Т) х х*у,хуу,хну х+у, х-у Мультипликвтивныэ Адцитивные Умножение, деление и получение остатка. Сложение и вычитание. ' Более подробные сведения о выражениях значений по умолчанию можно найти в разделе "Выражение значения ло умолчанию" главы 11. Выражения в СВ практически идентичны выражениям в С++ и дача.
При построении выражений важно помнить о приоритетах операций. Выражения С» состоят из операндов — обычно переменных или типов приложения — и операций. Многие из операций могут быть также перегружены. Перегрузка операций рассматривается в главе 6. В табл. 3. 1 перечислены приоритеты групп операций. Те, что находятся в верхней части таблицы, имеют более высокий приоритет, а операции, перечисленные внутри одной и той же категории — равный приоритет. Обзор синтаксиса СЗ 39 Окончание табл. 3. Г Описание Группа операций Входящие операции Сдвиг влево и вправо.
Сдвига х«у, х»у Меньше чем, больше чем, меньше или равно, больше или равно. х<у,х>у,х<=у,х>=у с тле, если х может быть преобразовано в т, иначе — Та1эе. Отношений и проверки типа х Тз Т Возвращаетх, преобразованное в Т, или по11, если преобразование невозможно. х аз т Эквивалентно и неэквивалентно. Эквивалентности х==у,х )=у Целочисленное побитовое "И", булевское логическое "И". Логическое "И" ха у Целочисленное побитовое исключающее "ИЛИ", булевское логическое исключающее "ИЛИ".
Логическое исклю- чающее "ИЛИ" х" у Целочисленное побитовое "ИЛИ", булевское логическое "ИЛИ" Логическое "ИЛИ" х)у Условное "И" Возвращается у, только если х истинно. х ак у х)) у х?? у Возвращается у,только если х ложно. Условное "ИЛИ" Сравнения с пп11 Если х не равно по11, возвращается х, иначе — у, х?у:х Возвращается у, если х истинно, иначе — к.
Условные Простое присваивание. х= у Присваивание нли анонимная функция Составное присваивание: может быть *=, /=, Ъ=, +=, = —, «кч»=, а=, "=или ) =. х ор= у Лямбда-выражение (анонимная функция/метод) (Тх) =>у На заметку) В разных контекстах зти операции могут иметь разное значение. Независимо от этого, их приоритеты никогда не меняются. Например, операция + может означать конкатенацию строк, если применяется к строковым операндам.
Используя перегрузку операций при определении собственных типов, можно заставить зти операции выполнять нечто семантически осмысленное для данного типа. Тем не менее, приоритеты операций изменить нельзя, за исключением тех случаев, когда применяются скобки. В выражениях операции с одинаковым приоритетом обрабатываются на основа ассоциативности. Все бинарные операции кроме присваивания являются левоассоциативными, а операции присваивания и условная операция (тернарная) — правоассоциативными. Операторы и выражения Операторы в Сй гщентичны по форме операторам в С++ и дата.
Точка с запятой завершает однострочный оператор. Однако блоки кода, заюпоченные в фигурные скобки (вроде тех, что следуют за операторами ТТ и ил11е), не должны завершаться точкой с запятой. Добавлять точку с запятой в конец блока не обязательно. Большинство операторов, доступных в С++ и дача, также доступны в СЗ, включая операторы объявления переменных, условные операторы, операторы управления потоком выполнения, операторы слуг'сагой и тд.
тем не менее, в сл (как и в дата) доступны 40 Глаза 3 некоторые операторы, не существующие в С++. Например, в С№ предусмотрен оператор СгуЛ1па11у, который подробно обсуждается в главе 7. В главе 12 будет описан оператор 1ос~с, синхронизирующий доступ к блокам кода. В С№ также перегружается ключевое слово п эх по, так что его можно использовать и как директиву, и нак оператор. Оператор свупо можно применять в сочетании с шаблоном Э1вроваЫе, о котором говорится в главах 4 и 13.
Также заслуживает упоминания оператор гогеасЬ, облегчающий итерацию по элементам коллекций. Более подробно этот оператор рассматривается в главе 9, когда пойдет речь о типах коллекций. Типы и переменные Каждая сущность в программе С№ является объектом, находящимся либо в стеке, либо в управляемой куче. Каждый метод определен в объявлении класса или структуры. Здесь нет вещей, подобных свободным функциям, которые определены вне контекста объявления с1авв или всгпсг, как в С++. Даже встроенные типы значений, такие как 1пг, 1опс, 1опд бооЬ1е и тд., имеют методы, ассоциированные с ними неявно. Поэтому в С№ вполне допустимо написать оператор вроде следующего: Яувсег.сопэо1е.нгасеЬ№пе( 42.товггьп Оператор, подобный этому, где метод вызывается на значении 4 2, покажется незнакомым тем.
кто работал на С++ или дата. Однако он подчеркивает, что в С№ все является объектами, даже самые базовые типы. Фактически ключевые слова встроенных типов в С№ на самом деле отображаются на типы из пространства имен Був Сев, представляющие их. Можно даже не использовать встроенные типы С№, а вместо этого явно применять типы из пространства имен Яувсет, на которые они отображаются (хотя такая практика нежелательна из соображений стиля). В табл. 3.2 описаны встроенные типы с уназаиием их размера и типов, на которые они отобрансаются в пространстве имен Бу в сеп.
Таблица 3.2. Встроенные типы С№ Совместимость с СЬБ вЬусе впогс гп Яувгеп.БВуге Бувгеп.1пг16 Яузгет.1сг32 Нвт 16 32 1оп9 Яувгеп.1пг64 Ьусе Яувгет.Буге Яувсеп.О1пг16 Яувгеп.91пг32 овпогг о№пс п1опд спаг 16 32 Бувгеп.О1пг64 Бувгеа.БЬаг 64 16 Ьоо1 Бувгет.воо1еас Бувгеп.Я№пд1е Яувгет.сопЬ1е 32 64 Яувгеа.оесъпа1 Бувгега.ЯСг1пд Бувгеп.ОЬЗесг Бувгет.ОЬ3есг 128 Тип С№ Размер в битах Тип Яузеем 11оас оопЬ1е с1ес1тв1 всггп9 оЬБесг оупаа1с Да Да Да Дв Нзт Нет Нет Да Да Да Да Да Да Да Дв Обзор синтаксиса С!) 41 Для каждого элемента этой таблицы в последней колонке указана совместимость данного типа со спецификацией общего языка (Сопппоп 1лпяпаяе 8рес!Йсайоп — С1.8). С(8 определена как часть стандарта СЫ для облегчения функциональной совместимости между языками.
С(Б является подмножеством общей системы типов (Сопппоп ЗУре 8уз!еш — СТ8). Несмотря на то что С1,К имеет развитый набор встроенных типов. не все языки, компилируемые в управляемый код, поддерживают их полный перечень. Однако все управляемые языки должны поддерживать типы из С1.8. Например, 1т!зпа( Ваз!с традиционно никогда не поддерживал беззнаковых типов. Поэтому проектировщики СЫ определили С18 для стандартизации типов с целью облегчения функциональной совместимости между языками. Если приложение будет целиком написано на СЗ и не взаимодействует с компонентами, позаимствованными из других языков, то беспокоиться о соответствии строгим требованиями С1.8 не стоит. Но если работа ведется над проектом, в котором компоненты строятся с использованием различных языков, то соответствие С18 становится намного более важным. В управляемом мире СЬК существуют два вида типов.
° Типы значений (ча1пе !урез). Определяются в СЗ с применением ключевого слова зсгисс. Экземпляры типов значений — единственный вид экземпляров, которые могут располагаться в стеке. В куче они находятся, если являются членами ссылочных типов или же упакованы в объекты ссылочных типов, о чем будет рассказываться позднее. Эти типы подобны структурам С++ в том смысле.
что по умолчанию они копируются по значению при передаче в вице параметров методам или присваивании другим переменным. Хотя встроенные типы СЗ представляют тот же вид значений, что и примитивные типы, Зама, полных аналогов в Зага для них нет. ° Сськлочные пшпы (геуегепсе !урез). Часто определяются в Сй с применением ключевого слова с1азз. Они называются ссылочными типами потому. что переменные. используемые для манипуляций ими, в действительности являются ссылками на объекты из управляемой кучи. Фактически переменные ссылочных типов СЬН подобны переменным типов значений, которые имеют ассоциированный тип и содержат указатель на объект в куче, Для определения таких объектов, создаваемых в куче, используется определение с1азз.















