You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi匿名方法内部接口为何在循环中仅创建一次?

Delphi匿名方法仅创建一次接口实例的原因及合理性

为什么循环中只创建一次接口对象?

Delphi编译器对匿名方法做了实例复用优化:当匿名方法的代码逻辑完全一致,且捕获的变量作用域未发生变化时,编译器只会生成一个接口实例,不会在每次循环迭代中重复构造。

在你的代码里,循环内的匿名方法始终是G_Int := i;,捕获的是Test过程内的局部变量i——这个变量的作用域覆盖整个Test过程(从进入到退出),而非单次循环迭代。编译器判定该匿名方法的结构和捕获目标没有变化,因此复用同一个接口实例,避免不必要的内存分配和构造开销。

仅创建一次是否足够?

完全足够,核心原因是匿名方法捕获的是变量的引用(内存地址),而非变量的当前值:

  • 接口对象内部存储的是循环变量i的内存地址,而非每次循环的i值;
  • 每次调用AInf()时,都会通过这个地址读取i的当前值,再赋值给G_Int。比如循环到i=50时,调用匿名方法会读取此时i内存中的50;到i=99时则读取99,完全能正确获取循环的最新值。

补充说明:Delphi的循环变量(比如这里的i)生命周期是整个Test过程,而非单次迭代——也就是说整个循环里只有一个i变量在内存中,只是每次循环更新它的值。所以匿名方法只要持有这个变量的引用,就能在每次调用时拿到最新值,不需要重新创建接口实例。


内容的提问来源于stack exchange,提问作者qgi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 15:03:16