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
相关产品推荐
相关产品推荐

