Delphi/pascal析构函数和c#

Mok*_*euh 0 c# delphi pascal

假设此类定义正在运行

TStringListNF = class (TStringList)
  procedure TestContenu (verif : Boolean);
  destructor DestroyList;
  destructor DestroyListFree;
end;
Run Code Online (Sandbox Code Playgroud)

而且这门课的班级也在工作

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;
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么有两个析构函数以及如何在c#中复制两个析构函数

正如你所看到的那样,代码已经过时但是正在工作,我试图让它在c#上工作,所以我要做的只是创建一个析构函数并在析构函数中做我想做的事情?

Dav*_*nan 8

这堂课有三个破坏者.继承的虚析构函数,以及这里声明的两个.但是,我从未见过正确的设计是声明一个新的析构函数的情况.您应该始终覆盖在中声明的虚拟析构函数TObject.

根本不需要这些析构函数,它们应该被删除.如果字符串列表的用户希望列表获取列表中保存的对象的所有权,OwnsObjects则应将该属性设置为True.

即使基类尚未支持此特定功能,正确的解决方案始终是覆盖虚拟析构函数.如果您需要改变该析构函数的行为,那么需要使用状态或其他机制来实现.但绝不会实施新的析构函数.

所有这一切的原因是所有Delphi开发人员都希望能够调用Free一个实例,并确信该对象已被成功销毁.由于Free调用了声明的虚析构函数TObject,结论是所有破坏代码都应该驻留在该方法的覆盖中.

我如何在C#中复制两个析构函数?

你不能.AC#类只能有一个析构函数.更重要的是,你没有像在Delphi中那样编写C#析构函数.C#是一种垃圾收集语言.Delphi没有垃圾收集.

我对你的一般建议是你不应该试图从Delphi翻译成C#.您应该编写适合该语言的代码.在Delphi中实现类的方式与C#类似但不同.编写适合目标语言的代码.

  • @RobKennedy我喜欢可以验证代码的想法,然后添加评论的行为足以证明它有效.无论如何,我添加了几个段落来解释如果基类没有碰巧具有必要的功能该怎么做. (2认同)