Определение класса

Последнее обновление: 07.07.2022

Основным строительным блоком программы в .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 (значение по умолчанию) указывает, что класс виден только из текущей сборки.

Размещение в памяти

Ряд флагов позволяет управлять размещением в памяти. Здесь есть три альтернативных варианта:

  • Флаг auto (значение по умолчанию) указывает, что при загрузке класс будет размещаться в памяти автоматически, там, где среда сама разместит данный класс.

  • Флаг sequential позволяет разместить поля класса в том порядке, в котором они определены в классе.

  • Флаг explicit позволяет явным образом настроить для каждого поля класса размещение в памяти.

Кодировка строк

Ряд флагов позволяет задать режим преобразования строк внутри класса при взаимодействии с неуправляемым кодом. Имеется два альтернативных варианта:

  • Флаг ansi (значение по умолчанию) указывает, что строка будет конвертироваться в кодировку ansi.

  • Флаг unicode указывает, что строка будет преобразовываться в кодировку UTF-16.

  • Флаг autochar указывает, что текущая платформа сама определяет режим преобразования строки.

Пример использования некоторых флагов:

.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
    }
  }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850