托管局部变量是否可以透明地“前往”另一个本地范围?

时间:2011-11-10 13:49:18

标签: delphi scope

这个问题与my other one有关,我希望从中得到一些想法:

本地托管变量(记录,接口,...)是否可以在不使用任何显式输出/ var参数或结果值的情况下使用本地范围并“转到”另一个范围?

很抱歉,如果这听起来很奇怪,但这样我就可以在一个名为的方法中创建一个托管对象,该方法只有在调用方法结束时才会被销毁,而不是一个已创建的,而整个过程对调用者完全透明(这是主要目标)。调用者不必声明任何内容。

第一个hacky想法来到这里:

(Mis-)将自动创建的包装器对象用于匿名方法并将数据附加到该方法。我的假设是:此对象在调用者本地范围内创建,在callees本地范围内生存(因此被调用者可以向其附加数据),并一直持续到调用者的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;

我想我应该。

1 个答案:

答案 0 :(得分:4)

  

很抱歉,如果这听起来很奇怪,但这样我就可以在被调用的方法中创建一个托管对象,只有在调用方法结束时才会被销毁,而不是在创建它的时候销毁。这样我就没有了使用/ var变量或返回值(这实际上是我的目标)。

来自CALLED方法的托管局部变量需要“移动”到调用方法。对于类似的事情,唯一定义的方法是使用varout或返回实际值。这是因为可以“传输”的所有“托管”数据类型都是引用计数的。这包括接口和字符串。

  

将自动创建的包装器对象用于匿名方法并将数据附加到该方法。我的假设是:这个对象是在调用者本地范围内创建的,在callees本地范围内生存(所以被调用者可以将数据附加到它),并一直持续到结束;来电者。

Delphi为匿名方法生成实际的TInterfacedObject后代。它将为声明匿名方法的每个方法/过程生成一个这样的后代。生成的对象的名称将基于声明匿名方法的过程的名称。这个对象有方法,每种方法都使用一种匿名方法。它还有数据字段:匿名方法中使用的每个局部变量的一个字段,以及对您正在操作的对象的引用。

请参阅此处获取详细说明:How and when are variables referenced in Delphi's anonymous methods captured?

这个想法是,您可以通过在声明匿名方法的相同过程中声明局部变量并在该匿名方法中使用它们来将数据字段附加到匿名方法。然后你就可以掌握这些数据,但这将是一个hacky,困难的方式:你需要将匿名方法转换为实现对象(匿名方法实际上是一个接口,所以它可以完成)。然后,您需要使用RTTI来获取保存数据的字段。对我来说似乎没什么用。