В результате обработки программы компилятором С#, Visual Basic .NET или любым другим компилятором способным генерировать CIL, получают управляемый модуль (managed module), т. е. просто исполняемый файл, предназначенный для исполнения CLR.
В традиционных программных средах объекты создаются и уничтожаются в точные, определенные моменты времени. В качестве примера рассмотрим класс, написанный на неуправляемом C++...
Благодаря упаковке/распаковке программист не замечает разделения на ссылочные и размерные типы. И все же иногда нужно знать, с какими типами вы работаете. Ведь тонкие различия между этими двумя разновидностями типов могут оказать на приложение такое воздействие, которого вы никак не ожидали.
Разработчики .NET Framework могли бы сделать все типы ссылочными, но они предпочли поддерживать еще и размерные типы, чтобы избежать неоправданных издержек при использовании целых чисел и других элементарных типов данных.
Если все, что вы пока узнали в главе 1, кажется вам безнадежной абстракцией, не падайте духом: сейчас все станет очень конкретным. Пора создать ваше первое приложение для .NET Framework. И конечно, лучше всего начать с управляемой версии «Hello, world». Для простоты мы напишем консольное приложение — исполняющееся в окне командной строки. Это позволит ограничиться небольшим объемом кода и сосредоточиться на наиболее важных вопросах.
Рассмотрим программу на рис. 1-4- Для начинающих: в каждом приложении должна быть точка входа. В Си-приложении таковой является статический метод с именем Main. Он есть в каждом С#-приложении. Так как в С# каждый метод должен принадлежать какому-либо типу, в Hello.cs метод Main является членом МуАрр. В имени класса ничего волшебного. Мы могли бы назвать его Foo, и он работал бы так же. Если в приложении несколько классов с методами Main, класс, содержащий точку входа приложения указывается с ключом компилятора /main.
Делегаты часто смущают новичков в .NET Framework. Делегат представляет собой оболочку функции обратного вызова, обеспечивающую контроль типов. Можно без труда написать приложение на неуправляемом C++, которое рухнет при выполнении обратного вызова. Но делегаты просто не позволяют написать управляемое приложение, которое проделало бы то же самое.
Перечисления в .NET Framework подобны перечислениям в C++. Они являются типами, состоящими из множества именованных констант и в С# определяются ключевым словом enum. Вот пример простого перечислимого типа Color.
Интерфейс — это группа из ноля или более абстрактных методов, т. е. таких методов, у которых нет реализации по умолчанию, но которые реализуются в классах или структурах. Интерфейсы могут также содержать свойства и события, но методы распространены гораздо шире.
Классы понадобились для представления сложных типов данных. Поскольку экземпляры класса размещаются в управляемой куче, их создание и уничтожение связано с определенными издержками. Однако некоторые типы являются «простыми», и лучше помещать их в стек, на который не распространяется действие сборщика мусора и который обеспечивает более высокую производительность.
Класс в .NET Framework аналогичен классу в C++: совокупность кода и данных, формирующая объект при создании экземпляра класса. В традиционных объектно-ориентированных языках, таких как C++, классы содержат члены-переменные и члены-функции.
Прежде чем углубиться в изучение библиотеки классов Microsoft .NET Framework (FCL) и разнообразных моделей программирования, которые она поддерживает, полезно разобраться в том, из чего образована эта библиотека.
Чтобы увидеть Hello.exe так, как видит его CLR, откройте Hello.exe в ILDASM, На экране появится окно (рис. 1-6). Дважды щелкнув первый красный треугольник-декларацию сборки, вы увидите список сборок, от которых зависит данная сборка («.assembly extern mscorlib*-) (рис. 1-7).
Часто CIL называют псевдоассемблером, так как он определяет набор команд некоего процессора. Однако в данном случае процессором является не кусок кремния, а CLR. При написания программ для .NET Framework знать CIL нужно не более, чем ассемблер х8б для программирования под Windows.
Основные метаданные модуля хранятся в виде набора таблиц. В одной из них — TypeDef — перечислены определенные в этом модуле типы. (Тип — это общий термин, обозначающий классы, структуры, перечисления и иные формы данных, поддерживаемые CLR). В другой таблице перечислены методы, реализованные этими типами, в третьей — поля, в четвертой — свойства и т. д.
.NET Framework — это платформа для построения и исполнения приложений. Ее основные компоненты — общеязыковая исполняющая среда (common language runtime, CLR) и библиотека классов .NET Framework (FCL).
Инициатива Microsoft .NET Microsoft NET — это грандиозная попытка Microsoft отойти от традиционных методов разработки и превратить — с помощью других компаний разработчиков —Интернет в сервисо-ориентированную программную платформу.
С-программисты, пишущие для Windows, обычно используют в своих программах вызовы API Windows и DLL других производителей: С++ программисты часто используют библиотеки классов, написанные ими самими или стандартные библиотеки типа MFC. Visual Basic-программисты используют API Visual Basic, представляющие абстракцию низкоуровневых API ОС.
Теперь вы знаете, что компиляторы .NET Framework генерируют управляемы е модули и что эти модули содержат CIL и метаданные. Однако вас может удивить, что CLR неспособен использовать управляемые модули напрямую. Дело в том, что базовой единицей защиты, управления версиями и развертывания в.NET Framework является не управляемый модуль, а сборка (assembly).