delphi - 有人可以向我解释一下匿名方法吗?

标签 delphi closures anonymous-methods

Delphi 2009 中有一些很酷的东西,其中还包括匿名方法。我已经看过有关匿名方法的示例和博客文章,但我还没有明白。有人能解释一下为什么我应该感到兴奋吗?

最佳答案

请查看closures .

Delphi 匿名函数是闭包。

它们是在其他函数中创建的,因此可以访问该函数的范围。即使将匿名函数分配给在调用原始函数之后调用的函数参数,情况也是如此。 (我稍后将创建一个示例)。

type
  TAnonFunc = reference to procedure;
  TForm2 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    F1 : TAnonFunc;
    F2 : TAnonFunc;
  end;

procedure TForm2.Button1Click(Sender: TObject);
var
  a : Integer;
begin
  a := 1;

  F1 := procedure
  begin
    a := a + 1;
  end;

  F2 := procedure
  begin
    Memo1.Lines.Add(IntToStr(a));
  end;
end;

上面的方法将两个匿名函数分配给字段F1和F2。第一个增加局部变量,第二个显示变量的值。

procedure TForm2.Button2Click(Sender: TObject);
begin
  F1;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  F2;
end;

您现在可以调用这两个函数,并且它们访问相同的 a.因此,调用 F1 两次,调用 F2 一次,显示 3。 当然,这是一个简单的例子。但它可以扩展到更有用的代码。

在多线程环境中,可以在 Synchronise 调用中使用匿名函数,这样就无需使用无数的方法。

关于delphi - 有人可以向我解释一下匿名方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/256146/

相关文章:

用于生成共享相同闭包变量的匿名委托(delegate)的 C# 技术

delphi - 为什么在我切换 ViewStyle 之前,TListView 的 Node 文本会被省略号截断?

delphi - 依赖于版本的编译 - $ENDIF 和 $IFEND

scala - 最终在 Specs2 上尝试编写带有闭包的测试失败

javascript - 无法访问javascript中函数内的函数

delphi - 使用Delphi,无法使用匿名类型作为记录类型?

android - Android 版 Firemonkey 中的游戏循环

delphi - 如何使用 MSBuild 和包含在存储库中的编译器构建 delphi 应用程序(未随 IDE 安装)

closures - 如何在闭包中保存变量的值

c# - 动态创建匿名类型的属性