Заметки
Nil - это начало пути

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика
Предисловие.

Есть такой раздел среди программистов C++, называется «Непонятный Си». В него входят программы, которые работают правильно, но вот почему - неочевидно. Но вот среди программистов Delphi я такого раздела не встречал. Что ж, буду первым!

1. Как это работает.

При объявлении класса определяются все его поля и методы. Под поля выделяется место в момент создания экземпляра класса. А методы помещаются в «фиксированное» адресное пространство. И когда экземпляры класса обращается к методу, то делается переход по одному и тому же адресу в памяти. И это правильно, какой смысл создавать абсолютно одинаковые процедуры и функции для каждого экземпляра класса!?

Если все понятно, развиваем тему. Когда компилятор, анализируя программный код, видит обращение к методу класс, он ставит переход на конкретный адрес в памяти. И вот тут начинается самое интересное! При вызове метода не проверяется, был ли создан сам экземпляр класса! И поэтому можно сделать так:

// 1.1. Определим класс
type
  TMagicClass = class
  public
    procedure Show;
  end;

// 1.2. Создадим метод
procedure TMagicClass.Show;
begin
  ShowMessage('Упс.');
end;

// 1.3. Вызываем
TMagicClass(nil).Show;

Запускаем и удивляемся.

2. Как это НЕ работает.

Если внутри метода класса попытаться обратится к полям класса, тогда получаем исключение "Ошибка доступа", так как значение Self будет равно nil.

// 2.1. Определим класс
type
  TMagicClass = class
  public
    Size: Integer;
    procedure Show;
  end;

// 2.2. Создадим метод
procedure TMagicClass.Show;
begin
  ShowMessage(IntToStr(Size));
end;

// 3.3. Вызываем
TMagicClass(nil).Show;

3. Заключение.

Надеюсь, Вы узнали что-то новое и улыбнулись. Веселого Вам кододелания.

Автор: Thunderchild.

.: Пример к данной заметке :.


При использовании материала - ссылка на сайт обязательна