Основным строительным блоком программы в .net является класс. Определение класса располагается после заголовка программы. Например, возьмем из прошлой главы простейшую программу, которая просто выводит строку на консоль:
.assembly extern System.Runtime { .ver 6:0:0:0 } .assembly extern System.Console { .ver 6:0:0:0 } .assembly HelloApp{} .module HelloApp.dll .class Program { .method private static void main(string[] args) cil managed { .entrypoint ldstr "Hello, METANIT.COM!" call void [System.Console]System.Console::WriteLine(string) ret } }
После определения модуля идет определение единственного класса в модуле - класса Program:
.class Program { .method private static void main(string[] args) cil managed { .entrypoint ldstr "Hello, METANIT.COM!" call void [System.Console]System.Console::WriteLine(string) ret } }
После директивы .class до названия класса может идти перечисление флагов класса. Рассмотрим некоторые флаги.
Классы могут иметь определенную область видимости. Для ее определения применяются два ключевых слова: public и private. Ключевое слово public указывает, что класс виден вне текущей сборки. И, наоборот, слово private (значение по умолчанию) указывает, что класс виден только из текущей сборки.
Ряд флагов позволяет управлять размещением в памяти. Здесь есть три альтернативных варианта:
Ряд флагов позволяет задать режим преобразования строк внутри класса при взаимодействии с неуправляемым кодом. Имеется два альтернативных варианта:
Пример использования некоторых флагов:
.class public auto ansi Program { .method private static void main(string[] args) cil managed { .entrypoint ldstr "Hello, METANIT.COM!" call void [System.Console]System.Console::WriteLine(string) ret } }
В данном случае класс Program определен как публичный - виден вне своей сборки. Он использует флаг auto, то есть среда сама решает, как поля класса, если бы они были, располагаются бы в памяти. И флаг ansi задает преобразование строк в кодировку ansi.
Классы могут размещаться в пространствах имен. Пространство имен задается с помощью директивы .namespace, после которой идет название пространства имен. Пространство имен по сути просто представляет префикс, используемый в имени всех классов внутри данного пространства имен. Пример применения пространств имен:
.assembly extern System.Runtime { .ver 6:0:0:0 } .assembly extern System.Console { .ver 6:0:0:0 } .assembly HelloApp{} .module HelloApp.dll .namespace Hello // определение пространства имен { .class Program { .method private static void main(string[] args) cil managed { .entrypoint ldstr "Hello, METANIT.COM!" call void [System.Console]System.Console::WriteLine(string) ret } } }