我认为你可以对此感到自信。这种超出范围的模式可能会在这个方法的指令块中保持全局性。这将是一种破坏性的变化。
请参见Embarcadero的巴里·凯利(Barry Kelly)在
此评论中所说:
“至于你之前的评论,关于显式变量:在假设的(并且具有破坏性变化的)情况下,当我们优化接口变量使用时,我们很可能不仅会破坏所描述的类RAII功能,而且还会破坏显式变量方法;分配给FooNotifier和BarNotifier的值并没有被使用,所以“理论上”它们可以更早地被释放,并且潜在地甚至可以重用相同的存储空间。”
“但当然,接口的销毁可能会产生副作用,这正是本文所依赖的效果。改变语言,使得这些副作用具有可见的变化,不是我们愿意做的事情。”
因此,你可以猜测Embarcadero不会在这里引入任何向后兼容性的变化。重用接口内存的好处并不值得破坏兼容性和引入副作用:在当今这个时代,保存一个指针(4或8字节)已经不值得了,特别是当栈已经分配和对齐时(x64模型使用的堆栈比x86更多)。
只有在引入语言垃圾收集器的情况下(从我个人的角度来看,我不想要),对象的生命周期可能会发生变化。但在这种情况下,生命周期可能会更长。
在所有情况下,你可以创建自己的代码,以确保它将在方法结束时被释放:
var
lHelper: IMyHelper;
begin
lHelper := TMyHelper.Create(some params);
try
...some code that doesn't have to access lHelper
finally
lHelper := nil; // release the interface count by yourself
end;
end;
实际上,这是编译器已经生成的代码。写这个代码将完全多余,但它将确保编译器不会欺骗您。
在讨论接口和引用计数时,请考虑Delphi中循环引用的潜在问题。请参见关于接口循环引用需要“弱指针”的
这篇优秀文章(即“示例2-15”)。
其他语言(如Java或C#)使用垃圾回收器来解决此问题。Objective C使用显式的“零化弱指针”机制来解决它 - 请参见
这个讨论或
这个SO答案可能的实现方式。也许未来版本的Delphi可以考虑使用类似于Objective C中引入的ARC模型的实现方式。但我怀疑会有一个明确的语法来保持与现有代码的兼容性。
TSynLog.Enter;
将自动对其进行性能分析,并在函数 TSynLog.Enter 返回的接口生成“离开”日志条目。 - Arnaud Bouchez