Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi/pascal析构函数与c#_C#_Delphi_Pascal - Fatal编程技术网

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我喜欢代码可以被验证的想法,然后添加注释就足以证明它是有效的。无论如何,我添加了几段来解释如果基类没有必要的功能该怎么办。