Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 15
Текст из файла (страница 15)
Чтобы проиллюстрировать идею, пространство имен Аде.ус111саев 56 Глава 3 было пополнено новым классом по имени Апотсегпг11№гу. Этот класс должен быть полностью квалифицирован при обращении к нему, поскольку для него никакого псевдонима не объявлено. Кстати, совершенно допустимо дать псевдониму другое имя, отличное от яовепс№1№су, Хотя назначение псевдониму другого имени может быть полезно для предотвращения конфликтов имен, все же лучше использовать псевдоним, совпадающий с исходным именем класса, чтобы избежать в будущем путаницы при сопровождении. На заметку! Если вы следуете четким принципам разделения при определении пространств имен, то не столкнетесь с этой проблемой. В проектировании считается дурным тоном создавать пространства имен, которые содержат множество разнообразных типов, относящихся к различным группам функциональности.
Вместо этого должны создаваться пространства имен с интуитивно взаимосвязанными типами внутри; это облегчит для разработчиков нахождение нужных типов. В .г(ЕТ Егаглеаогх неоднократно встречаются пространства имен с некоторыми общими типами, включенными в них, и с более "развитыми" типами, включенными во вложенное пространство имен под названием лочапсео, например, яуясев.
хв1. яег№а1№зат№оп. Аочапсегд Во многих отношениях при создании библиотек такие рекомендации отражают принцип открытости, применяемый при создании интуитивно понятных пользовательских интерфейсов. Другими словами, выбирайте интуитивно понятные имена и группы для типов и делайте их легко обнаруживаемыми. Поток управления Подобно С, С++ и дача, язык С№ включает обычный набор структур, управляющих потоком управления. В С№ реализован даже такой непопулярный оператор, как сосо. Н-Е18Е, ВУМ1Е, 6О-ЫМ1Е И ЮОГ Конструкция 1№-е1яе в С№ идентична той же конструкции в С++ и дача. В качестве рекомендации по стилю: в операторах №г предпочтительней всегда использовать блоки, как и в любых других операторах управления потоком, даже если эти блоки содержат всего один оператор, как в примере ниже; №Г( <Сеет сепг)1С1оп> ) ( Сопяо1е.иггеев№пе( "Выполнение находится э этой точке." ) ) Операторы нЬ11е, т)о и бог идентичны доступным в языках С++ и дача.
ЭЫ~1С№1 Синтаксис оператора янаесЬ в С№ очень похож на синтаксис ян№осЬ в С++ и дача. Основное отличие состоит в том, что ян№ссЬ в С№ не допускает прохода в следующий раздел. Он требует наличия в конце каждого раздела оператора Ьгеа)с (или другой передачи управления).
В целом это отличное требование. В С++ н дача присутствует масса трудно обнаруживаемых ошибок, которые являются следствием того, что разработчики забывают вставить оператор Ьгеа)силн меняют порядок разделов внутри ян1ссЬ, когда один из них позволяет проходить потоку управления в другой. В С№ компилятор немедленно сообщит об ошибке, если обнаружит проход нз одного раздела в следующий. Единственное исключение из этого правила состоит в том, что можно иметь несколько меток (используя ключевое слово саяе) на один раздел янагсЬ, как показано в следующем фрагменте кода.
Кроме того, можно эмулировать прохождение сквозь раздел с помощью оператора дого: Обзор синтаксиса Сй 57 яиттсл ( К ) саве 0: Сопяо1е.нт1те11пе( "саяе 0" ); ОоСо саве 1; саве 1: саве 2: Сопяо1е.нгстесспе( "саяе 1 или саяе 2" Ьтеаьл 1 На заметку! Использование оператора сосо обычно считается дурным тоном в программировании, поскольку, помимо прочего, порождает код, который очень трудно сопровождать, Наличие этого оператора в языке отнюдь не означает возможность его бесконтрольного использования.
Вообще говоря, случаи, когда оператор сосо необходим, чрезвычайно редки. Всякий раз, когда обнаруживается, что можно применить посо, рекомендуется пересмотреть дизайн и проверить, не покрывает ли оператор сосо некоторый изъян в дизайне. Обратите внимание, что в конце каждого раздела имеется некоторая форма оператора перехода.
Даже последний раздел должен содержать его. Многие разработчики С++ и Юача пропускают оператор Ьгеах в последнем разделе, поскольку после него все равно происходит выход потока управления за пределы яи).СсЬ. Изящество принципа "никаких сквозных проходов" состоит в том,что даже если разработчик, сопровождающий код, впоследствии решит поменять местами порядок меток, он не привнесет никаких ошибок.
в отличие от С++ и дача. Обычно для завершения разделов яитссп используется оператор Ьтеах. но для выхода из этого раздела можно применять любой оператор, в том числе сьтои и теспгп, а также сопстппе, если яизссь встроен в цикл, в котором применение сопттппе имеет смысл. ЮохеасЬ Оператор Еоте асЬ позволяет выполнять итерацию по коллекции объектов в синтаксически естественной манере.
Следует отметить, что ту же функциональность можно реализовать с использованием цикла ип11е. Однако это может выглядеть некрасиво, к тому же итерация по элементам коллекции — настолько распространенная задача, что синтаксис Еогеасп является полезным дополнением к языку. Если, например, имеется массив (или коллекция любого другого типа) строк, то пройти по всем строкам можно с помощью следующего кода: ятят1с чо1С Мвтп() ( яттспд[) ятт1пся = пеи ятг1пс[5)к яттспся[0) = "ВсЬ"! ятгспдя[1) = тасе"; тогезсп( ятгспс 1теи тп яттспдя ) ( Сопяо1е.нг1те1.тпе( "(О)", ттея ) ) Внутри скобок цикла Еотеасп можно объявить тип переменной итератора.
В данном примере это строка. За объянлением типа итератора идет идентификатор коллекции, по которой нужно выполнить итерацию. Здесь может использоваться любой объект, реализующий шаблон Со!!еспоп [Коллекция) '. Тнп, реализующий шаблон проектирования Со!)есноп [Коллекция). должен реализовать либо интерфейс 1еппиегаь1е [или тепппетаь1е<>),либо общедоступные методы сесеппвегясст н мсченехс вместе с общедоступным свойством ситтепс. другими словами. для использования в операторе гогеасп тип не обязан реализовыватыхппиетяЪ1е, хотя типичная реализация шаблона проектирования Сойесноп предусматривает именно реализацию упомянутого интерфейса. 58 Глава 3 Коллекции подробно рассматриваются в главе 9, в которой также исследуется вопрос о том, какие вещи должен реализовать тип, чтобы трактоваться как коллекция.
Естественно, элементы внутри коллекции, используемые в операторе Гагеасп, должны быть явно преобразуемыми к типу итератора. Если это не так, то оператор гагеасп сгенерирует исключение 1пча11аСавсххсерс1оп во время выполнения. Если хотите испытать это на собственном опыте, попробуйте запустить следующую модификацию предылущего примера: вгаг1с во1а Магп() ( оь]есг[] вгг1пав = пея аь]вся[5]; впг1пав(0] = 1) вяг1пав[1] = 2) гогевсп( всг1пз 1Геа гп всг1пав ) ( Сопво1е.вг1се11пе( "(О)", ьсет ) Обратите внимание, что в коде, вставленном в оператор гагеасЬ, не допускается модификация переменной итератора.
Она должна трактоваться как доступная только для чтения. Это означает, что переменную итератора нельзя передавать методу в качестве выходного [опс] или ссылочного [гег] параметра. Если вы попытаетесь сделать что-либо подобное, то компилятор немедленно сообщит об ошибке. ЪХЕаХ, СОП1~аиЕ, ДО~О, ЮЕ1иЕП И ~ВЕЛ Язык С№ включает набор знакомых операторов, которые позволяют безусловно передавать управление в другое место кода.
К ним относятся Ьгеа)г, сопя).ппе, доса, гесигп и гпгоя. Их синтаксис должен быть знаком любому разработчику С++ нли дача [хотя оператор дога в дача отсутствует). Применение этн операторов, по сути, идентично во всех трех языках. Резюме В настоящей главе был представлен синтаксис С№. При этом всячески подчеркивалось, что С№, подобно другим похожим объектно-ориентированным языкам, является строго типизированным языкам. В этих языках используется механизм проверки типов компилятора, который позволяет отыскать как можно больше ошибок во время компиляции, вместо того, чтобы находить их позднее, во время выполнения.
В С1Л все типы классифицируются как типы значений или ссылочные типы, и каждой категории присущи собственные ограничения, которые будут подчеркиваться на протяжении всей книги. Также здесь была представлена концепция пространств имен и показано, как они помогают избежать засорения глобального пространства имен слишком большим количеством типов, имена которых могут вступать в конфликты. И, наконец, было продемонстрировано, как работают управляющие операторы в С№, а также описаны их сходства и отличия с аналогичными операторами в С++ и дача. В следующей главе будет глубже рассматриваться устройство классов и структур вместе с отличиями в поведении их экземпляров. Глд~~ 4 Классы, структуры и объекты в се. что угодно, является объектом! По крайней мере, если смотреть с точки зрения СЬВ и языка программирования С№.
Это не удивительно, потому что С№ — в конце концов, объектно-ориентированный язык. Создаваемые через определение классов объекты С№ обладают теми же возможностями, что и другие предопределенные в системе объекты. Фактически, ключевые слова языка С№ вроде ьпс и Ьоо1 — это просто псевдонимы для предопределенных типов значений из пространства имен яузсель в данном случае — яузсегл. 1псз2 и яузсеа. Воо1еап соответственно.
На заметку! Настоящая глава довольно объемная, но пусть это не пугает. Для того чтобы удовлетворить запросы широкой аудитории, я постарался осветить насколько возможно много базового материала по С№. Если вы — профессионал в области С++ или дача, то можете пропустить эту главу и обращаться к ней по мере чтения последующих глав. Некоторые из затронутых здесь тем более подробно раскрываются в последующих главах. Первый раздел этой главы посвящен определению классов (ссылочных типов), а за ним следует дискуссия об определениях структур (типов значений). Это две фундаментальных группы типов в исполняющей системе .НЕТ.














