Delphi 将对象引用指定给变量

Delphi 将对象引用指定给变量,delphi,object,reference,free,assign,Delphi,Object,Reference,Free,Assign,我有一个关于分配的问题,我想知道 “指定”是否创建整个对象的副本,以及 我想知道FTEA.Objects[0]是否也被释放。 我想复制FTEA.Objects[0],当我释放ObjCur时,我不打算释放FTEA.Objects[0]-不确定这样做的正确方法,需要您的帮助,谢谢: function xxxxxxxxxxxxxxxxxxxxxxxx var curQuo, tempQuo:TXX_TEA; begin curQuo :=TXX_TEA(FTEA.Objects[0]);

我有一个关于分配的问题,我想知道

“指定”是否创建整个对象的副本,以及 我想知道FTEA.Objects[0]是否也被释放。 我想复制FTEA.Objects[0],当我释放ObjCur时,我不打算释放FTEA.Objects[0]-不确定这样做的正确方法,需要您的帮助,谢谢:

function xxxxxxxxxxxxxxxxxxxxxxxx
var 
  curQuo, tempQuo:TXX_TEA;
begin
  curQuo :=TXX_TEA(FTEA.Objects[0]);
  if xxxxxxxxx then
  begin
    tempQuo := TXX_TEA.Create();
    tempQuo.Assign(curQuo);   // Question 1: Assign copy the whole object value or not
    objCur.AddQuo(tempQuo)
  end
  else
    TXX_TEA(objCur.Quos[0]).Assign(curQuo);
  end;

  finally
    objCur.Free; // Question 2: FTEA.Objects[0] is freed or not
  end;
end

否,从另一个对象释放已指定的一个对象不会释放源对象


Assign将如何工作完全取决于类。如果类兼容,每个类都必须实现Assign,然后调用inherited,并将其自己的自定义属性从源分配到目标。我建议查看这些类的源代码,检查它们是否实现了Assign。

Assign是一个必须按类实现的例程,因此它执行编程要执行的操作。它应该尽可能复制作为参数传递的整个对象。但如果不能,它可能不应该复制任何东西

某些类的实现可能不符合该非强制约定,只复制它们所需的部分。换句话说,复制什么完全取决于实现

赋值没有特殊意义,它是一个普通函数,而不是某种编译器魔法。它不会对作为参数传递的对象执行任何操作,因此释放一个对象不会影响另一个对象。这些对象是完全独立的


请注意,并非所有类都实现Assign。您可能认为调用了类的赋值,但实际上可能是继承的赋值,它不知道要复制的派生类中的任何新成员。Assign的概念很好,但不幸的是,它经常没有实现或没有正确实现。

我检查了他们是否实现了Assign,并将每个属性从源分配给类对象。那么tempQuo.AssigncurQuo你认为它会将curQuo指向tempQuo对象的对象的每个属性赋值吗?Spspli,与其问一群陌生人他们认为会发生什么,不如运行代码,看看这些属性是否被复制到新对象上?你已经被告知会发生什么,所以去看看吧。这是编程,不是哲学。@Rob:+1代表编程,不是哲学。当我看到两个程序员在工作中争论在程序中执行X是否会产生效果Y或效果Z时,我总是感到很烦。有时我厌倦了告诉他们,运行它看看会发生什么!我检查了代码,分配正确实现,它分配了每个属性。感谢您的回答。FTEA.Objects[0]未在此处释放。很高兴知道它正确地实现了分配。IME,在第三方代码中并不总是这样。对无用的问题投了反对票。@spspli:我同意@Warren的观点,尽管我没有投反对票。尝试发布使用函数xxxxxxxxxxxxxxxxxxxxxxxx之类的示例代码,如果xxxxxxx和TXX_TEA使其难以阅读和理解。发布您的实际代码,仅对隐私等进行必要的更改。发布无用的示例代码会使您很难给出有用的答案。