new String("0") === new String("0")
Здесь вы сравниваете две разные строки, имеющие разные ссылки. Вот почему вы получаете ложь.
o === o
Здесь вы фактически сравниваете одну и ту же строку (в этом случае ссылка одна и та же).
В Delphi 2009 существует способность иметь ссылку на монитор синхронизации. См.:
class function TMonitor.GetFieldAddress(AObject: TObject): PPMonitor;
class function TMonitor.GetMonitor(AObject: TObject): PMonitor;
... в System.pas
Кроме того, существует все еще указатель на VMT. (Таблица виртуальных методов.) От Delphi вкратце:
Класс TObject объявляет, что несколько методов и одно специальное, скрытое поле хранят ссылку на класс объекта. Это скрытое поле указывает на таблицу виртуальных методов (VMT) класса. Каждый класс имеет уникальный VMT, и все объекты того класса совместно используют VMT класса.
Объект содержит записи для всех своих полей плюс дополнительное пространство для содержания указателя на таблицу виртуальных методов. VMT содержит больше, чем просто указатели виртуального метода. Я объясняю больше о VMT на моем веб-сайте, включая схему.
По-видимому, Delphi 2009 представляет другое скрытое поле в дополнение к указателю VMT для содержания монитора синхронизации. Можно определить, добавляется ли это вначале или в конце класса с некоторым простым кодом:
type
TTest = class
FField: Integer;
end;
var
obj: TTest;
ObjAddr, FieldAddr: Cardinal;
begin
Assert(TTest.InstanceSize = 12);
obj := TTest.Create;
ObjAddr := Cardinal(obj);
FieldAddr := Cardinal(@(obj.FField));
writeln(FieldAddr - ObjAddr);
end.
Если это печатает значение 4, то поле монитора должно быть в конце объекта потому что 4 только счета на размер указателя VMT. Если это печатает значение 8, то поле монитора должно быть в запуске, смежном с указателем VMT.
Я ожидаю, что Вы найдете монитор в запуске. Иначе это означает, что расположение объекта-потомка не является просто расположением базового объекта со всеми новыми добавленными полями. Это означало бы, что смещение поля монитора зависит от типа выполнения объекта, и это делает реализацию более сложной.
Когда класс реализует интерфейс, структура объекта включает более скрытые поля. Поля содержат указатели на интерфейсно-ссылочное значение объекта. Когда Вы имеете IUnknown
ссылка на объект, указатель это, хранения не являются тем же как указателем на поле VMT объекта, которое является тем, что Вы имеете с обычной ссылкой на объект. IUnknown
значение указателя будет адресом скрытого поля. Я записал больше о расположении классов той реализации интерфейсы.
На всякий случай кто-то задается вопросом, почему Craig Stuntz' ответ был accpepted, см. его последний комментарий к тому ответу:
Похож был добавлен в D2009: http://blogs.embarcadero.com/abauer/2008/02/19/38856 Видит ссылки в том сообщении для полного изложения.
Ссылка, больше не доступная, но Wayback Machine, имеет его:
https://web.archive.org/web/20160409224957/blogs.embarcadero.com/abauer/2008/02/19/38856