Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 155
Текст из файла (страница 155)
Очевидно, что зто не так удобно, как продемонстрированное выше создание свойств на лету. Кстати, единственный способ удаления свойств из экземпляров ЕхрвпбоОЬ3есг состоит в вызове методов интерфейса 101сгьопвгу<вггьпд, вгг1пд>. На заметку! При использовании ехрвпбоОЬ3 есг часто приходится выполнять определенную долю приведения. Разумеется, такие приведения могут приводить к генерации исключений, но такова уж природа отложенной проверки типов компилятором во время выполнения. А как насчет динамических методов? До сих пор было показано только создание свойств экземпляров ЕхрапбоОЬ3есс через переменные типа бупвиьс.
На самом деле динамические методы создаются столь же легко. В приведенном ниже коде экземпляр по имени бупвнасЕхргевв1сп содержит коллекцию коэффициентов для вычисления одномерного полинома: цвбпд Яувсеи! цвзпд Яувсет.Оупвтгсг цв1пд Бувгез.вгпд.Ехргевв1спвг цвзпд Яувсеи.сс11ес11опв.сепег1сг всвсзс с1ввв ЕпсгуРогпс ( всвс1с тогб Мвап() ( бупаи1с бупвизсЕхргвввзоп = пен ЕхрвпбоОЬ)есс() // Добавить коэффициенты бУПВИ1СЕХРГЕВВ1СП.СОЕС11С1ЕПГВ ПЕН 11ВГ<бУПВИРС>() бупвизсЕхргеввзоп.Сое111саепсв.Абб( 2 )г бупвт1сЕхргеввзоп.Соеггасаепсв.Абб( 5 )г бупвиасехргеявзоп.Соеггзс1епсв.Абб( 3 )г Динамические типы 583 11 Создать динамический метод бупаваоЕхртваахоп. Соврпсе = пви раас<с)опЬ1е, бопЬ1е>( (х) => ( «)опЬ1в твап1Е = От Вот( Епс 1 = О; 1 < т(упата1окхртеаа1оп.сову№1с1епса.соппст ++1 ) ( тваа1Е +а (ЙочЬ1в)бупаапсЕхртваааоп.Совееасувпеа(11 * Мазь.рои( х, (т(опЬ1е] 1 )т ) твсптп теап1Е) 1 )' !у Вычислить значение Сопзо1е.кг(кеьупе( т)упаы1скхргезз1оп.соырике(2) Область кода, где создается и затем вызывается динамический метод по имени Сопрпке, выделена полужирным.
Все, что требуется для этого сделать — это создать экземпляр делегата и присвоить его свойству экземпляра Ехрапс)оОЬ) еск, причем имя этого свойства будет именем, ассоциированным с новым методом. Затем реализация интерфейса 1оупапусиесаОь)ессргочусег в ехрапс)оОь1есс позволяет просто вызывать его через делегат, используя привычный синтаксис вызова метода, если это делается через переменную типа т)упапт1с. В предыдущем коде применялся делегат типа Еппс<>, представленный с помощью лямбда-выражения. Резюме В этой главе рассматривался тип Супапус, добавленный в С№ 4.0.
Возможность взаимодействия — это главная тема, связанная с динамическими типами. Теперь стало намного проще взаимодействовать с такими динамическими языками, как 1гопРу)Ьоп и 1гопйпЬу, и с унаследованными объектами автоматизации СОМ. Код, вааимодействующий с этими технологиями, стал яснее и чище. Кроме того, было продемонстрировано использование типа ЕхрапбоОЬ) еос для создания динамически типизованных объектов во время выполнения.
В отношении возможности взаимодействия язык С№ наконец достиг уровня ч)зпа) Ваз)с. Однако такая мощь часто несет с собой опасности, и динамические типы в этом отношении не являются исключением. При неправильном применении можно обойти строгую проверку компилятором статических типов и внести нежелательные ошибки, которые останутся в тени. К тому же, работа с динамическими типами в некоторых ситуациях непроста, особенно в том, что касается преобразований типа во время выполнения и разрешения перегрузок.
Как любое другое мощное средство языка, применять его скупо и осторожно означает использовать мудро. Например, когда возникла мода на объектно-ориентированные языки, все стали рассматривать наследование как универсальное окончательное решение. Однако опыт быстро показал, что в случае неправильного применения оно приводит к созданию программного обеспечения, которое почти невозможно сопровождать. Выражаясь кратко: соблюдайте осторожность при использовании динамических типов.
в Б ЛТ (див!! п Типе), 21 ЛТ-компиляция, 30 Выражение, 38 динамическое, 569 запроса, 531 инициализатора, 122 лямбда-, 503 Предметный указатель А АОР (Авресс-ог1епсес1 рпзЯгапип!пя), 44: 62 Ап. (Асиче Теспр!а1е ЫЬгагу), 170; 326 ВСЬ (Вазе С1авв ЫЬгагу), 173; 339 С№, 37; 48; 76 встроенные типы С№, 40 выражения в С№, 38 модификаторы доступа, 76 операторы, 39; 56; 57; 58 переменные,40 перечисления (епшп), 43 типы, 40 СЕК(Сопя(га1пес1 Ехесииоп Кел$оп), 206 СЫ (Сопипоп 1лпЕиаде 1п1гавсгиссиге], 22 СЬК(Соплпоп Ьапаиаяе КипШпе), 21; 29; 31 СЬБ (Сопппоп [лп8иа8е Брес9)сапоп), 32; 41 СТБ (Сопппоп ТУре Бувсегп), 32; 41 0 РЬК (Рупаппс Ьапдиа8е Киписпе), 557 РОМ (Росшпеп1 ОЬ)ес1 Мобе!), 27 О БАС (О!оЬа) АввешЫу СасЬе), 33 ОС (С агЬаяе Со))ес1ог), 23 !РЬ (1п1ег(асе Ревсгсрпоп Ьапдиа9е), 151 )ЬРАБМ (1псеггпес[$асе 1лпдиаде Р$ваввешЫег), 30 ЬРМЬ (Ьоса1е Раса Маг1сир Ьапдиа8е), 227 ы)$$Я (ьап8иаяе !псеягасеб Яиегу), 26; 525 м МАР (Мапаяеб Асы!п Ргзгпеи огК), 151 $$$$г$ ($$$оп-У$гсив) !псеИасе), 424 БОА (Бегсбсе-огсеп1ес[ агсЬПессиге), 149 БТ1.
(Бсапбагс1 Татр[все ЫЬгагу), 25 ТЬ8 [ТЬгеаб-!оса[ в1огаяе), 369 ТРЬ (Тав1с Рвга11е1 ЫЬгагу), 341; 41 1 $ГЕБ ($$$гсиа) Ехесииоп Був1епт), 29 %М! ($$$сспс[осчв Мапалешеп1 1пвитипепсагсоп), 27 й!БРЬ (%[геЬ Бегсчсев Ревсгсриоп 1лпдиаде), 151 Ад РЬЬ (РЬЬ Не!!), 33 Аргументы ге1, 133 -значения,132 именованные.137 необязательные, 136 Архитектура вепчсе-огсепсес1 агсЬ Тес!иге (8ОА), 149 Атрибуты, 61 Безопасность, 189 Библиотека МАК 151 БТ1., 25 ТР1., 341; 411 активныхшаблонов(АТЬ),170;326 базовыхклассов[ВСЬ), 173; 339 Предметный указатель 585 уенерация исключений, 190 Данные метаданные, 34 Делегат несвязанный, 289 обобщенный.
319 одиночный, 285 открытого экземпляра, 289 привязка параметров, 303 создание, 284 цепочка делегатов, 286 зкземпляр делегата, 284 Дизассемблер 1ЬРАБМ, 29 Директива цз!пя, 55 Загрузчик сборок, ЗЗ Замыкание !с!озпге), 300; 503; 506; 517 Запрос ключевые слова запросов С№, 530 переменная запроса,528 стандартные операции запросов, 529 И Инвариантность, 338 Индексатор, 90 Инициализатор, 63 объекта, 105 Инициализация полей, 118 Инкапсуляция, 72 Интерфейс,77:102;149;151;306 1С1опеаЫе, 426; 465 !Со, 260 1СотаратаЫе, 254 1СошрагаЫе, 116: 180 !СопчегтаЫе, 458 !СопчегПЫе, 160 1Спз1оптроппацег, 232 !Р!зрозаЫе, 129; 433 1ЕпшпегаЫе<Т>, 268 1Епшпега1огкГ>, 268 !ВтппаттаЫе, 457 1Огоцр!пд, 538 !Ьтз1, 263 1Мпз1сап, 78 !11!Сон!го!.
150; 153; 155 ттта!!батат, 499 контракты интерфейса, 169 обобщенный,316 объявление,152 отображениеинтерфейса, 154 реализация, 154 неявная,!55 явная,155:164 Исключение генерация исключений, 190 код, нейтральный к исключениям, 200 обработка исключений, 128 обработка исключений в С№, 190 сгенерированное в блоке Нпзйу, 196 Итератор, 272 двунаправленный, 277 обратный, 277 пользовательский, 491 прямой,277 К Каррирование(сшту!пд), 521 Класс Аснчагог, 355 Вазе, 124 С!гс!е, 80 СотЬоВох, 159; 160 Сошратег<Т>, 352 Сотпр1ех. 176 Сопзо1е, 96 Сопчегг, 161; 457 Ренчеб, 61 Рече!орет, 145 Оган!пя, 89 РупапксОЬ) ест, 564 ЕпшпегаЫе, 491 Ехтепз!опМетЬобз, 478 РйеЫгеатп, 155 Оеотетг!сБЬаре, 80 !птег1ос!тед, 375 !гегатог, 89 Мониот, 382 ОЬ)ес1, 114 Ратайе1.
413 ЯиетуаЫе, 491 Еестапя!е. 80 БатеНапб1е. 208 Бос1те1, 407 Брййлс!т, 381 ТВ!ептебРегзоп, 78 Таз!т. 412 ТЬгеаб. 360 ТЬтеадроо!. 403 Т!тпег, 410 2ооРиейег, 169 Л Литерал строковый,224 586 Предметный утазатель абстрактный, 86 вложенный, 87 герметизированный, 85 листовой (зеа1еб), 86 невложенный,87 обобщенный, 313 определение класса.
59 определенияклассов,61 статический. 94 частичный, 92 Ключевое слово аЬз!гас!, 86 Ьазе, 84; 85; 122 сонет, 463 !огеасЬ, 554 пещ 90; 101; 116; 117; 159 оЬ)ест, 114 ои1, 134; 336 рзгашз, 135 рагба1. 93 рича!е, 71 геб 134 зез1еб, 86 втптсг, 61 т)из, 90; 100; 101; 102 из!па, 55; 129; 131; 478 ч!г!иа1, 141; 159 Ключевые слова запросов С№, 530 Ковариантность, 334 Код безопасный, 45 нейтральный к исключениям, 200 родной (панче), 22 управляемый. 21 Коллекция инициализаторы коллекций, 281 синхронизация коллекций.
261 Компаратор обобщенный, 344 Компиляция ЛТ,21; 30 Конструктор, 98 статический, 65; 119 экземпляра, 65; 122 Контравариантность, 337 Контракты, 167 интерфейса, 169 реализованные классами, 167 Лямбда-выражение, 503 Лямбда-оператор, 509 Лямбда-функция, 25 Манифест сборки, 32 Массив С№, 249 С/Се н 249 рагатоз, 135 зубчатый, 258 ковариантность массивов, 49 многомерный (прямоугольный), 256 Мемоизация (шещо)ха(!оп), 519 Метаданные, 34 Метод, 66 Ма1п(), 477 пещ 141 очегтЫе, 141 веа1ег1, 143 абстрактный, 140 виртуальный, 140 обобщенный, 317 перегрузка методов, 136 расширяющий (ех!епз!оп), 477 изоляция расширяющих методов в отдельном пространстве имен, 464 использование расширяющих методов вместо наследования.
483 статический, 66 фабричный (уасготу), 483 -фантом, 572 частичный, 93 экземпляра, 66 Многопоточность, 357 Модификатор пещ 144 очегтЫе. 141 зеа)еб. 143 зтабс, 94 ИПиа(, 141; 144; 147 Модификатор доступа, 61 1пгетпа1. 76 рича!е. 76 рте!ес!еб, 76; 79 рготестеб !и!егпа1. 76 рпЫ!с, 76 Наследование, 60; 79; 144; 326 пример неудачного наследования. 145 Предметный указатель 587 О Обобщения (депег!сз), 51; 309 Обработка исключений в СЕ, 1 Объект блокирующий, 391 одноразовый,128 уничтожение объектов, 125 детерминированное, 127 Ограничение (сопя!та!и!), 327 обобщения.329 первичное,330 Оператор сагсЬ, 190; 192: 195 бпайу, 192; 196 ГогеасЬ, 553 йпож 194;201 Пу, 192; 200 из1пя, 433 лямбда-, 509 Операторы в СЕ, 39 Операция аз, 50 !з, 50 бинарная,176;179 булевская, 185 перегрузкаопераций, 175 зеркальная,177 операции,допускающиеперегр преобразования, 176; 182 проекции, 527 сложения (+) перегрузка, 178 соединения () о!и), 532 сравнения, 179 унарнзя, 176: 179 Оптимизация управляемая профилем, 31 90 улку, 179 П Параметры отп (выходные), 134 Перегрузка операций, 175 зеркальная, 177 операции, допускающие перегрузку, 179 Переменная диапазона, 527 запроса.
528 захватпеременной, 517 захваченная.300 инициализация по умолчанию. 45 локальная неявнотнпизнрованная,46 ссылочного типа, 41; 60 Переходник (ГЬпп)к), 283; 284 Перечисления (епцш), 43 -флаги, 44 Поле (Йе!б), 62 геабоп!у, 63 инициализация полей, 118 Полиморфизм, 60: 80 Поток завершение потоков, 364 запуск потоков, 358 локальное хранилище потока (ПЗ), 369 переднего плана, 368 пул потоков,402 синхронизация рабаты между патоками, 373 управления, 56 управляемый, 357 фоновый, 368 Преобразование типа, 48 упаковывающее (Ьохптя сопчегз!оп), 49 Привязка параметров, 303; 521 Программирование аспектно-ориентированное (АОР), 44 интерфейсно-ориентированное, 149 функциональное.
489; 490; 503 Пространство имен. 53 Зузтетп.Со!1есцопз, ОЬ) ес~Мобе1, 264 ЗузтешШпф 527; 554 Зуз!еш. Кебесноп. Ешк. 580 синтаксис объявления, 54 Пул внутренний. 224 потоков, 402 Распаковка (ппЬох)пя). 110 Рекурсия анонимная, 523 Сборка (аззешЫу), 31 глобальный кзш сборок (ОАС), ЗЗ загрузка сборок, ЗЗ именование, ЗЗ строгое (полное), 33 частичное. ЗЗ манифест сборни, 31; 32 приватная,ЗЗ Сборщнкмусора(ОС),23;45;418 Свойства,67 автореализуемые, 70 доступные только для записи, 69 доступные только для чтения, 69 объявление свойств, 68 588 Предметный указатель Семафоры,396 Синхронизация,373 Система вегасе-ог1ептеб агс)П!ее!иге (8ОА), 149 Событие, 398 синхронизации, 399 Список, 262 Среда СЬК (общеязыковая исполняющая), 21; 23; 29-31 РЬК, 557 Строка поиск строк с помощью регулярных выражений,239 работа со строками из внешних источников, 236 сравнение строк, 234 форматная.














