Delphi/pascal析构函数与c#
假设这个类定义是有效的Delphi/pascal析构函数与c#,c#,delphi,pascal,C#,Delphi,Pascal,假设这个类定义是有效的 TStringListNF = class (TStringList) procedure TestContenu (verif : Boolean); destructor DestroyList; destructor DestroyListFree; end; 这个班的班子也在工作 destructor TStringListNF.DestroyList; {//Verified 27 june 98} var i : Integer; tem
TStringListNF = class (TStringList)
procedure TestContenu (verif : Boolean);
destructor DestroyList;
destructor DestroyListFree;
end;
这个班的班子也在工作
destructor TStringListNF.DestroyList;
{//Verified 27 june 98}
var
i : Integer;
tempItem : TObject;
begin
for i:= 0 to Count-1 do
begin
tempItem := Objects[i];
tempItem.destroy;
end;
inherited destroy;
end;
destructor TStringListNF.DestroyListFree;
{//Verified 27 june 98}
var
i : Integer;
tempItem : TObject;
begin
for i:=0 to Count-1 do
begin
tempItem := Objects[i];
if tempItem <> nil then
tempItem.destroy;
end;
inherited destroy;
end;
析构函数tstringlist;
{1998年6月27日}
变量
i:整数;
临时项目:托宾;
开始
对于i:=0到Count-1 do
开始
tempItem:=对象[i];
临时项目。销毁;
结束;
继承性破坏;
结束;
析构函数TstringlistF.DestroyListFree;
{1998年6月27日}
变量
i:整数;
临时项目:托宾;
开始
对于i:=0到Count-1 do
开始
tempItem:=对象[i];
如果项目为零,则
临时项目。销毁;
结束;
继承性破坏;
结束;
我的问题是为什么有两个析构函数,以及如何在c中复制两个析构函数#
正如你所看到的,代码很旧,但正在运行,我正试图让它在c上运行,所以我要做的只是创建一个析构函数,并在析构函数中执行我想要的任何操作?这个类有三个析构函数。继承的虚拟析构函数和此处声明的两个。然而,我从未见过正确的设计是声明一个新的析构函数的情况。您应该始终重写在
TObject
中声明的虚拟析构函数
这两个析构函数都不需要,应该删除它们。如果字符串列表的用户希望列表拥有列表中的对象的所有权,则应将OwnsObjects
属性设置为True
即使基类还不支持这个特定的功能,正确的解决方案始终是重写虚拟析构函数。若需要改变析构函数的行为,那个么需要使用状态或其他机制来实现。但决不能通过实现新的析构函数
这一切的原因是,所有Delphi开发人员都希望能够对实例调用Free
,并确信对象已成功销毁。由于Free
调用TObject
中声明的虚拟析构函数,因此得出的结论是所有销毁代码都应该驻留在该方法的重写中
如何在C#中复制两个析构函数
你不能。一个C#类只能有一个析构函数。更重要的是,您编写C#析构函数的方式与在Delphi中编写C#析构函数的方式不同。C#是一种垃圾收集语言。而且Delphi没有垃圾收集
我给你的更一般的建议是,你不应该试图从Delphi逐字翻译成C。您应该编写适合该语言的代码。在Delphi中实现类的方式与C#类似,但不同。编写适合目标语言的代码。无法回答。析构函数做什么。显示代码。几乎可以肯定,这段代码设计得非常糟糕。在C#中只能有一个析构函数,而在Delphi中只能有一个析构函数。这个班有三个,比它应该有的多了两个。无论是谁设计的,都是错的。我添加了析构函数部分的代码。这是我第一次在一个类中看到多个析构函数。如果连你都不知道为什么会有两个析构函数,为什么还要有人假设它在工作呢?@KeithMiller
StringList.OwnsObjects:=True
似乎更多appropriate@David-我不知道。我不认为这是在Delphi 6中,如果此代码在1998年6月确实得到验证,那么TStringList
还没有OwnsObjects
属性。Delphi 4只提供了11天,所以甚至没有一个TObjectList
@RobKennedy我喜欢代码可以被验证的想法,然后添加注释就足以证明它是有效的。无论如何,我添加了几段来解释如果基类没有必要的功能该怎么办。