相关疑难解决方法(0)

匿名方法 - 变量捕获与值捕获

下面是一个SSCCE,它基于Chris Rolliston优秀的Delphi XE2基础知识书第1部分的匿名方法部分中的一个例子,关于变量捕获的概念(其中的任何错误完全取决于我).

它完全按照我的预期工作,在连续点击BtnInvoke按钮时记录666,667,668,669.特别是它很好地说明了在btnSetUpClick退出后很长时间内捕获的局部变量版本I的持续时间.

到现在为止还挺好.我问的问题不在于这个代码本身,而是在Allen Bauer的博客中所说的:

http://blogs.embarcadero.com/abauer/2008/10/15/38876

现在,我知道最好不要和老板争论,所以我确信我错过了他在变量捕获和价值捕获之间区分的重点.以我简单的方式查看它,我的基于CR的示例通过捕获I作为变量来捕获I的值.

所以,我的问题是,鲍尔先生试图绘制的区别究竟是什么?

(顺便说一句,尽管每天都会看到SO的Delphi部分超过9个月,但我仍然不完全清楚这个q是否在主题上.如果没有,我道歉并且我会把它取下来.)

type
  TAnonProc = reference to procedure;

var
  P1,
  P2 : TAnonProc;

procedure TForm2.Log(Msg : String);
begin
  Memo1.Lines.Add(Msg);
end;

procedure TForm2.btnSetUpClick(Sender: TObject);
var
  I : Integer;
begin
  I := 41;
  P1 := procedure
    begin
      Inc(I);
      Log(IntToStr(I));
    end;

  I := 665;
  P2 := procedure
    begin
      Inc(I);
      Log(IntToStr(I));
    end;
end;

procedure TForm2.btnInvokeClick(Sender: TObject);
begin
  Assert(Assigned(P1));
  Assert(Assigned(P2));

  P1;
  P2;
end;
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2

6
推荐指数
2
解决办法
666
查看次数

标签 统计

delphi ×1

delphi-xe2 ×1