Украина |
Теория типов и типизация в .NET
Как показали исследования системы типизации Common Type System среды проектирования и реализации программных систем Microsoft .NET, эта иерархия имеет внушительный объем.
С целью повышения эффективности организации описания типов и манипулирования ими в программном обеспечении, работающем под управлением среды Microsoft .NET, вводится понятие пространства имен ( namespace ).
Пространством имен будем называть механизм среды Microsoft .NET, предназначенный для идентификации типов объектов языков программирования и среды реализации.
Значение механизма пространств имен состоит в том, что появляется возможность логической структуризации системы типизации Common Type System в среде разработки приложений Microsoft .NET.
Описания пространств имен по аналогии с описаниями типов данных размещаются в файлах.
Перечислим основные свойства, которыми характеризуются пространства имен в среде Microsoft .NET:
- пространства имен могут объединять различные сборки ;
- пространства имен могут быть вложенными друг в друга;
- между пространствами имен и файлами не существует однозначного соответствия (т.е. отображения, переводящего название пространства имен в имя файла);
- полное имя типа должно содержать все необходимые пространства имен.
Для иллюстрации применения механизма пространств имен в среде программирования Microsoft .NET приведем развернутый пример описания пространств имен на языке программирования C#:
namespace N1{ // N1 class C1{ // N1.C1 class C2{ // N1.C1.C2 } } namespace N2{ //N1.N2 class C2{ // N1.N2.C2 } } }
Рассмотренный пример содержит описания пространств двух имен: пространства N1 с описанием классов C1 и C2 и пространства N2 с описанием класса C2.
Заметим, что в комментариях к каждой строке программы на языке C# приведены полные наименования пространств имен. Так, для обращения к классу C2, описанному в пространстве имен N1, нужно использовать полное имя N1.C1.C2, а для обращения к классу C2, описанному в пространстве имен N2 - полное имя N1.N2.C2.
Таким образом, при адекватном употреблении полных квалификационных наименований пространств имен удается избежать коллизии обозначений типов.
Очевидно, что при проектировании и реализации масштабных программных комплексов используется весьма значительное количество идентификаторов и риск коллизии обозначений при использовании полных квалификационных имен многократно возрастает.
Оказывается, что непременное использование полных имен типов в среде программирования Microsoft .NET является избыточным требованием.
Для экономии трудозатрат и во избежание коллизий обозначений при разработке крупных программных систем в языке программирования C# предусмотрен оператор using, к рассмотрению которого мы и переходим.
Чтобы проиллюстрировать применение механизма ликвидации коллизии обозначений типов в пространствах имен среды программирования Microsoft .NET посредством оператора using , приведем развернутый пример на языке программирования C#:
using N1; C1 a; // Имя N1 является неявным N1.C1 b; // Полное имя C2 c; // Ошибка: имя C2 не определено N1.N2.C2 d; // Один из (под)классов C2 C1.C2 e; // Еще один из (под)классов C2 using C1 = N1.N2.C1; using N2 = N1.N2; C1 a; // Соответствует имени N1.N2.C1 N2.C1 b; // Соответствует имени N1.N2.C1
Заметим, что оператор using позволяет использовать типы как с указанием полного имени, так и без него, а также для указания альтернативных имен (alias).
Еще одним аспектом проектирования и реализации крупных программных комплексов под управлением среды Microsoft .NET является потенциальная коллизия имен типов в рамках масштабных проектов.
Для решения этой проблемы в среде разработки программного обеспечения Microsoft Visual Studio для каждого из проектов могут быть указаны так называемые ссылки, каждая из которых идентифицирует уникальную сборку - самодостаточную единицу для компиляции и выполнения в рамках программного проекта.
Ссылки передаются компилятору в ходе трансляции программы на том или ином языке программирования под управлением среды Microsoft .NET по ссылке (при этом используется опция /r или /reference ).
Скажем, команда на компиляцию файла HelloWorld с исходным текстом программы на языке C# со ссылкой на пространство имен System.WinForms.dll будет иметь вид:
csc HelloWorld.cs /reference:System.WinForms.dll
Как видно из приведенного примера, механизм ссылок реализует идентификацию сборки для использования в программном проекте.
Подводя итоги обсуждения механизмов управления пространствами имен среды проектирования и реализации программного обеспечения Microsoft .NET, отметим, что пространства имен предоставляют возможность сокращенного именования типов объектов на уровне языка программирования.
Таким образом, устраняется необходимость многократного повторения полного имени объекта и существенно уменьшается риск коллизии обозначений, что значительно экономит трудозатраты при проектировании и реализации сложных программных систем и комплексов.
Подводя итоги рассмотрения основных аспектов теории типов и типизации в языках программирования, можно сделать следующие выводы:
- теории с типами и языки программирования с типизацией имеют значительно более высокую вычислительную мощность, а, следовательно, более высокую теоретическую и прикладную значимость.
- технологическая платформа .NET обеспечивает ряд несомненных дополнительных преимуществ перед другими известными платформами в отношении системы типов.
В частности, технология .NET использует централизованную, унифицированную, интегрированную систему типизации Common Type System (CTS), общую для всех языков программирования, реализуемых на данной платформе.
Кроме того, в рамках технологической платформы .NET обеспечивается строгое, однозначное соответствие между примитивными типами языков программирования и базовыми классами. NET. Большинство компиляторов для языков программирования, которые реализованы для платформы .NET, имеют встроенную поддержку примитивных типов.
Целям безопасности типизации служит явное разделение на ссылочные типы и типы-значения, а также гибкий и надежный механизм преобразования типов-значений в ссылочные (известный также под названием boxing) и обратно (известный также под названием unboxing ).
Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [ 32, 43, 44, 59].