“参考”解决了什么问题

时间:2014-05-04 21:13:14

标签: delphi generics anonymous-methods

在Chris的博客上:http://delphihaven.wordpress.com/2011/07/14/weird-in-more-ways-than-one/

我找到了以下代码

type
  TLinkVisitor<T> = reference to procedure(const Item: T);

  TDoubleLinked<T> = record
    Prev: ^TDoubleLinked<T>;
    Next: ^TDoubleLinked<T>;
    Value: T;
    class function Create(const aValue: T): Pointer; static;
    function Add(const aValue: T): Pointer;
    procedure Delete;
    procedure DeleteAll;
    function First: Pointer;
    function Last: Pointer;
    procedure ForEach(const Proc: TLinkVisitor<T>);
  end;

“引用”关键字解决了哪些问题无法通过正常的程序类型完成?

2 个答案:

答案 0 :(得分:11)

使用reference程序,您可以使用:

  • 传统程序,或
  • 对象,类或记录的方法,或
  • 一种匿名方法。

使用匿名方法的能力可以将reference程序与所有其他程序类型区分开来。除了其他程序或方法类型之外,匿名方法的设置是变量捕获。

有关更详细的讨论,请参阅以下答案:What is the difference between of object and reference to?。匿名方法的官方文档也值得一读。

答案 1 :(得分:4)

根据官方文档,问题(待解决)是匿名方法是托管类型,而程序变量则不是。
'reference to'关键字比其他程序类型更通用。

以下是文档的用法:http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/anonymousmethods_xml.html

  

匿名方法通常分配给某些东西,如下例所示:

myFunc := function(x: Integer): string
begin
  Result := IntToStr(x);
end;

myProc := procedure(x: Integer)
begin
  Writeln(x);
end;
  

匿名方法也可以由函数返回,或者在调用方法时作为参数的值传递。例如,使用上面定义的匿名方法变量myFunc:

type
  TFuncOfIntToString = reference to function(x: Integer): string; 

procedure AnalyzeFunction(proc: TFuncOfIntToString); 
begin 
  { some code } 
end;

// Call procedure with anonymous method as parameter 
// Using variable: 
AnalyzeFunction(myFunc);

// Use anonymous method directly: 
AnalyzeFunction(function(x: Integer): string 
begin 
  Result := IntToStr(x); 
end;) 
  

方法引用也可以分配给方法和匿名方法。例如:

type
  TMethRef = reference to procedure(x: Integer);
TMyClass = class
  procedure Method(x: Integer);
end;

var
  m: TMethRef;
  i: TMyClass;
begin
  // ...
  m := i.Method;   //assigning to method reference
end;
  

但是,反之为为true:您不能将匿名方法分配给常规方法指针。方法引用是托管类型,但方法指针是非托管类型。因此,出于类型安全原因,不支持为方法指针分配方法引用。例如,事件是方法指针值属性,因此您不能对事件使用匿名方法。有关此限制的详细信息,请参阅有关变量绑定的部分。