gpt4 book ai didi

delphi - Delphi中的析构函数为什么这么命名?

转载 作者:行者123 更新时间:2023-12-03 14:47:53 24 4
gpt4 key购买 nike

Delphi 中的析构函数通常被命名为“Destroy”,但据我了解,您也可以

  • 以不同的方式命名析构函数
  • 有多个析构函数

这样做有什么原因吗?不同名称/多个析构函数的可能用例是什么?

最佳答案

理论上,您可以手动调用不同的析构函数来释放不同的外部资源,例如打破引用计数循环、删除或只是关闭文件等。

此外,由于 Object Pascal 语言没有那些神奇的 new/delete 操作,因此应该有一些标识符来调用来处理对象。

我更愿意回顾一下这一点。

“Turbo Pascal with Objects”风格的对象两者兼而有之 - 您调用“神奇”的 Dispose 过程,但显式指定要调用的析构函数,因为语言本身不知道要选择什么。类似地,“神奇”过程 New 必须提供手动选择的构造函数。

然而,这违反了 DRY 原则:编译器知道我们正在调用 d-tor 或 c-tor,但我们还必须额外调用这些“New”和“Dispose”函数。理论上,这可能可以将内存分配和信息馈送解耦,并以我们想要的方式将它们组合起来。但我认为这个功能实际上并没有被广泛使用。

有趣的是,Apple Objective C 中使用了相同的设计。您首先为该对象分配内存,然后为该新实例调用构造函数: http://en.wikipedia.org/wiki/Objective-C#Instantiation

当 Delphi 简化该模型时,几乎没有做出任何决定来使事情变得更加简化(和统一)。内存[解除]分配策略已转移到类级别,而不是调用站点。这使得调用“New”和命名构造函数的冗余形成鲜明对比。必须删除其中一个。

C++/C#/Java选择为其保留特殊的语言级关键字,使用重载函数来提供不同的c-tors。也许这符合美国风格的计算机语言。

然而,Pascal 的核心有两个想法:冗长和词汇量小。可以说,它们可以用其他欧洲学校语言(如 Scala)来追踪。如果可能,应该从语言本身中删除关键字并移动到外部模块 - 您可以从项目中添加或删除的库。重载函数是在很久以后才引入该语言的,早期的偏好肯定是有两个不同命名的(自文档化)函数名称。

这两种想法可能导致 Delphi 删除“神奇”过程,并仅通过使用的函数名称来推断调用站点的对象创建/销毁。如果您调用MyVar.Destroy,那么编译器会查看.Destroy的声明并知道我们正在删除该对象。同样,由于 CreateXXX 的声明方式,它知道 TMyType.CreateXXX(YYY,ZZZ) 是一个对象实例。

为了让 c-tor 和 d-tor 像 C++ 中那样无名,Delphi 必须在语言级别再引入两个关键字,就像 C++ 中的 newdelete.这似乎没有明显的优势。至少我个人更喜欢Delphi方式。

PS。我必须添加一个假设:我们谈论的是 1995 年左右的真正的 C++ 和 Delphi 语言。它们仅对堆分配的对象进行手动内存控制,没有垃圾回收,也没有自动引用计数。您无法通过为变量分配 nil/NULL 指针来触发对象销毁。

关于delphi - Delphi中的析构函数为什么这么命名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19927159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com