0

假设这个类定义正在工作

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# 上运行,所以我要做的只是创建一个析构函数并在析构函数中做任何我想做的事情?

4

1 回答 1

8

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

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

即使基类还没有支持这个特定的功能,正确的解决方案总是覆盖虚拟析构函数。如果您需要改变该析构函数的行为,则需要使用状态或其他一些机制来实现。但绝不是通过实施新的析构函数。

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

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

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

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

于 2013-06-20T14:07:39.750 回答