【发布时间】:2011-11-10 13:49:17
【问题描述】:
这个问题与my other one有关,希望能从中得到一些想法:
本地托管变量(记录、接口……)是否有可能在不使用任何显式 out/var 参数或结果值的情况下在本地范围内运行并“移动到”另一个范围?
对不起,如果这听起来很奇怪,但这将允许我在 调用 方法中创建一个托管对象,该对象只会在 调用 方法结束时被销毁,而不是它是在其中创建的,而整个过程对调用者是完全透明的(这是主要目标)。调用者不必声明任何东西。
第一个 hacky 想法来了:
(错误)为匿名方法使用自动创建的包装对象并将数据附加到它。我的假设是:这个对象是在调用者本地范围内创建的,在被调用者本地范围内存在(因此被调用者可以将数据附加到它),并且一直存在到调用者的end;。
是否可以将数据附加到此包装对象?除了hackyness:它有任何工作机会吗?
编辑:这个问题的更简单的措辞可能是:“如何在不使用任何参数或函数结果的情况下从函数传递结果值?”
Edit2:写一些代码让我怀疑我是否应该放手:
function TForm1.L<T>(Func: TFunc<T>):T;
var
Value: T;
begin
Result := Func;
// now attach something to the anon wrapper of Func
end;
function TForm1.O<T>(Value: T): T;
begin
Result := T;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
List: TList;
begin
for Item in L(O<TList>(List)) do
begin
end;
// List should be destroyed here
end;
我想我应该。
【问题讨论】:
-
您使用变量捕获的想法会奏效,但听起来它比仅传递参数更复杂和不透明。对于您的方式,您需要传递 anon func。这真的有什么帮助。
-
"How to pass a result value from a function without using any parameters or function result?":假设存在某种魔法,即使是在伪代码中也会是什么样子?实际问题的无用答案是:使用全局变量。 -
你想在这里解决什么问题?一般来说,这种隐藏的依赖关系(即方法 B 依赖于首先调用的方法 A)通常是代码理解和后续更改的障碍。
-
@HeinrichUlbricht,我建议使用显式销毁,它更不容易出错,而且真的没有那么困难。完成后使用
FreeandNil(MyObject);。使用try .. finally块来确保销毁发生。 -
你可以使用一个接口:它是引用计数的,所以当你停止使用它时会自动销毁。请记住不要将对同一对象的对象和接口引用混合在一起 - 仅通过一个或另一个来引用特定对象。