Delphi/pascal析构函数和c#

本文关键字:析构函数 pascal Delphi | 更新日期: 2023-09-27 18:19:25

假设这个类定义正常工作

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;

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

正如你所看到的,代码是旧的,但可以工作,我正试图使它在c#中工作,所以我要做的只是创建一个析构函数,并在析构函数中做任何我想做的事情?

Delphi/pascal析构函数和c#

该类有三个析构函数。继承的虚析构函数和这里声明的两个。然而,我从未见过声明一个新的析构函数是正确设计的情况。你应该总是覆盖在TObject中声明的虚析构函数。

根本不需要这两个析构函数,它们应该被删除。如果字符串列表的用户希望列表拥有列表中保存的对象的所有权,那么OwnsObjects属性应该设置为True

即使基类已经不支持这个特定的功能,正确的解决方案始终是重写虚析构函数。如果需要改变析构函数的行为,则需要使用状态或其他机制来实现。但永远不要实现新的析构函数。

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

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

你不能。一个c#类只能有一个析构函数。更重要的是,您不需要像在Delphi中那样编写c#析构函数。c#是一种垃圾回收语言。而且Delphi没有垃圾回收。

我给你的更一般的建议是,你不应该试图从Delphi逐字翻译到c#。您应该编写适合该语言的代码。在Delphi中实现类的方式与c#相似,但又有所不同。编写适合目标语言的代码。