Читаем Полное руководство. С# 4.0 полностью

В связи с изложенным выше возникает следующий резонный вопрос: если анало гичные функциональные возможности обобщенного класса Gen можно получить и без обобщений, просто указав объект как тип данных и выполнив надлежащее приведение типов, то какая польза от того, что класс Gen делается обобщенным? Ответ на этот во прос заключается в том, что обобщения автоматически обеспечивают типовую безо пасность всех операций, затрагивающих класс Gen. В ходе выполнения этих операций обобщения исключают необходимость обращаться к приведению типов и проверять соответствие типов в коде вручную.

Для того чтобы стали более понятными преимущества обобщений, рассмотрим сначала программу, в которой создается необобщенный аналог класса Gen. // Класс NonGen является полным функциональным аналогом // класса Gen, но без обобщений. using System; class NonGen { object ob; // переменная ob теперь относится к типу object // Передать конструктору ссылку на объект типа object. public NonGen(object о) { ob = о; } // Возвратить объект типа object. public object GetOb { return ob; } // Показать тип переменной ob. public void ShowType { Console.WriteLine("Тип переменной ob: " + ob.GetType); } } // Продемонстрировать применение необобщенного класса. class NonGenDemo { static void Main { NonGen iOb; // Создать объект класса NonGen. iOb = new NonGen(102); // Показать тип данных, хранящихся в переменной iOb. iOb.ShowType; // Получить значение переменной iOb. // На этот раз потребуется приведение типов. int v = (int) iOb.GetOb; Console.WriteLine("Значение: " + v); Console.WriteLine; // Создать еще один объект класса NonGen и // сохранить строку в переменной it. NonGen strOb = new NonGen("Тест на необобщенность"); // Показать тип данных, хранящихся в переменной strOb. strOb.ShowType; // Получить значение переменной strOb. //И в этом случае требуется приведение типов. String str = (string) strOb.GetOb; Console.WriteLine("Значение: " + str); // Этот код компилируется, но он принципиально неверный! iOb = strOb; // Следующая строка кода приводит к исключительной // ситуации во время выполнения. // v = (int) iOb.GetOb; // Ошибка при выполнении! } }

При выполнении этой программы получается следующий результат. Тип переменной ob: System.Int32 Значение: 102 Тип переменной ob: System.String Значение: Тест на необобщенность

Как видите, результат выполнения этой программы такой же, как и у предыдущей программы.

В этой программе обращает на себя внимание ряд любопытных моментов. Прежде всего, тип Т заменен везде, где он встречается в классе NonGen. Благодаря этому в клас се NonGen может храниться объект любого типа, как и в обобщенном варианте этого класса. Но такой подход оказывается непригодным по двум причинам. Во-первых, для извлечения хранящихся данных требуется явное приведение типов. И во-вторых, мно гие ошибки несоответствия типов не могут быть обнаружены вплоть до момента вы полнения программы. Рассмотрим каждую из этих причин более подробно.

Начнем со следующей строки кода. int v = (int) iOb.GetOb;

Теперь возвращаемым типом метода GetOb является object, а следовательно, для распаковки значения, возвращаемого методом GetOb, и его последующего со хранения в переменной v требуется явное приведение к типу int. Если исключить приведение типов, программа не будет скомпилирована. В обобщенной версии этой программы приведение типов не требовалось, поскольку тип int указывался в каче стве аргумента типа при создании объекта iOb. А в необобщенной версии этой про граммы потребовалось явное приведение типов. Но это не только неудобно, но и чре вато ошибками.

А теперь рассмотрим следующую последовательность кода в конце анализируемой здесь программы. // Этот код компилируется, но он принципиально неверный! iOb = strOb; // Следующая строка кода приводит к исключительной // ситуации во время выполнения. // v = (int) iOb.GetOb; // Ошибка при выполнении!

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT