Указатель против TType - PullRequest
       3

Указатель против TType

3 голосов
/ 23 октября 2011

У меня есть довольно простой вопрос, но я просто хотел убедиться.

Есть ли разница между этими двумя?

var ClassArray: array of TMyClass;

constructor TMyClass.Create;
begin
  SetLength(ClassArray, Length(ClassArray)+1);
  ClassArray[Length(ClassArray)-1]:=Self;
end;

begin
  for i:=0 to x do
  ClassArray[i].MyProcedure;

и

var PointerArray: array of Pointer;

constructor TMyClass.Create;
begin
  SetLength(PointerArray, Length(PointerArray)+1);
  PointerArray[Length(PointerArray)-1]:=Self;
end;

begin
  for i:=0 to x do
  TMyClass(PointerArray[i]).MyProcedure;

Поскольку из-за того, как он работает, когда я играю с ним, единственное отличие состоит в том, что я не могу напрямую просматривать элементы в PointerArray (так как отображается только адрес).

Спасибо

1 Ответ

6 голосов
/ 23 октября 2011

Две версии идентичны с точки зрения кода, который генерирует компилятор.Это связано с тем, что ссылка на экземпляр реализована в виде указателя.

Разница в том, что для версии, основанной на указателях, компилятор не знает, что содержимое массива является ссылкой на экземпляр.Вот почему вы должны привести к TMyClass, чтобы иметь возможность вызывать метод, и поэтому понимание отладчика способно показать вам только адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...