Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 匿名方法:变量绑定与var参数_Delphi_Anonymous Methods - Fatal编程技术网

Delphi 匿名方法:变量绑定与var参数

Delphi 匿名方法:变量绑定与var参数,delphi,anonymous-methods,Delphi,Anonymous Methods,我想知道,在匿名方法的引用不超过绑定变量的情况下,例如当使用它作为回调时,它们之间的空间需求或性能或其他方面是否存在差异 在匿名方法中绑定变量,只需在内部使用它 通过var参数将变量传递到匿名方法 案例1的示例: type TCallback = reference to procedure (LogMsg: string); procedure Log(Msg: string; Callback: TCallback) begin Callback(Msg + '(' + Date

我想知道,在匿名方法的引用不超过绑定变量的情况下,例如当使用它作为回调时,它们之间的空间需求或性能或其他方面是否存在差异

  • 在匿名方法中绑定变量,只需在内部使用它
  • 通过var参数将变量传递到匿名方法
  • 案例1的示例:

    type 
      TCallback = reference to procedure (LogMsg: string);
    
    procedure Log(Msg: string; Callback: TCallback)
    begin
      Callback(Msg + '(' + DateTimeToStr(Now) + ')');
    end;
    
    procedure Test;
    var
      Suffix: string;
      Callback: TCallback;
    begin
      Suffix := '12345';
      Callback := 
        procedure (LogMsg: string)
        begin
          ShowMessage(LogMsg + Suffix);
          Delete(Suffix, 1, 1);
        end);
      Log('Test1', Callback);
      Log('Test2', Callback);
      Log('Test3', Callback);
    end;
    
    案例2的示例:

    type 
      TCallback = reference to procedure (LogMsg: string; var Suf: string);
    
    procedure Log(Msg: string; Callback: TCallback; var Suf: string)
    begin
      Callback(Msg + '(' + DateTimeToStr(Now) + ')', Suf);
    end;
    
    procedure Test;
    var
      Suffix: string;
      Callback: TCallback;
    begin
      Suffix := '12345';
      Callback := 
        procedure (LogMsg: string; var Suf: string)
        begin
          ShowMessage(LogMsg + Suf);
          Delete(Suf, 1, 1);
        end);
      Log('Test1', Callback, Suffix);
      Log('Test2', Callback, Suffix);
      Log('Test3', Callback, Suffix);
    end;
    
    如果我没有犯错误,这两个值都应该给出以下值:

    Test112345
    Test22345
    Test3345
    
    问题是:这两种方法中有哪一种可能更具性能(特别是当与比单个字符串更大的值一起使用时)、更具内存效率、更具优势,还是它们完全相同


    我知道,如果匿名方法的引用寿命比绑定变量长,那么变量的生存期也会有所不同,但本次讨论仅限于引用寿命不超过绑定变量的情况。

    正确的术语是:变量捕获。这意味着变量的生存期延长了。在某些情况下,你需要的正是这一点。这就像是要将值传递给对象的构造函数或作为方法调用的参数一样。一般来说,参数比捕获的变量更有效。这是否重要取决于上下文。@DavidHeffernan这就是我的想法,也正是我想在这里说的。请您详细解释一下,或者链接一些文件好吗?我无法在google中找到合适的关键字来查找任何内容,几乎所有内容都是关于如何使用这些匿名方法以及如何使用这些方法,但从未涉及性能问题。我不知道任何此类文档。只需进行分析。