gpt4 book ai didi

delphi - 如果我在 "with"子句中创建一个对象,我还需要释放它吗?

转载 作者:行者123 更新时间:2023-12-03 18:53:30 25 4
gpt4 key购买 nike

在我的资料中,我经常看到并使用这样的结构:

with TSQLDataSet.Create(nil) do try
//Dosomething, get a result from a query.
finally
Free;
end;

但我也经常看到施工:
with TSQLDataSet.Create(nil) do begin
//Dosomething, get a result from a query.
end;

如果我创建带有结构的对象,我需要释放它们还是在 with block 的末尾自动释放它们?

最佳答案

您需要 free .

因为Class.Create只是一个表达式,Delphi 无法知道结果值来自哪个表达式。

您可以只阅读 VCL 源代码 - 总是有明确的 .Free .

您可以想到非对象示例:

var r: record .... end;
with r do begin
...
end;

如果 Delphi 试图释放 with 上的所有内容end - 然后它会尝试 free非对象?
with SomeObjectFactory.GetMeAnObject do begin
...
end;

在这里,您不是通过构造函数创建对象,而是通过某个函数创建对象。而且这个功能和 TLabel.Font没有区别或 TDataSet.FieldByName .
德尔福应该 free还是不在这里?

为了避免冒险的猜测并保持一致 - with只是 with .它只是一个别名。而已。它是在 1974 年设计的,没有克隆最新的 .Net/Scala Using(x){..} 的功能。结构体。

你可能看到的是这样的结构
with TForm.Create(Application) do ...;
with TLabel.Create(MainForm.Panel1) do ...;

这是非常不同的 - 它确实将新创建的控件插入为属于所有者。业主会 free它拥有的所有组件 free d 本身。但这不使用 Create(nil) .当它仍然存在时 - 然后在 with 中阻止您会看到一些显式调用,将对象绑定(bind)到某个容器/父级(尽管在 .Create 和绑定(bind)之间的异常情况下这非常脆弱)。

关于delphi - 如果我在 "with"子句中创建一个对象,我还需要释放它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12642524/

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