在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;
“引用”关键字解决了哪些问题无法通过正常的程序类型完成?
答案 0 :(得分:11)
使用reference
程序,您可以使用:
使用匿名方法的能力可以将reference
程序与所有其他程序类型区分开来。除了其他程序或方法类型之外,匿名方法的设置是变量捕获。
有关更详细的讨论,请参阅以下答案:What is the difference between of object and reference to?。匿名方法的官方文档也值得一读。
答案 1 :(得分:4)
根据官方文档,问题(待解决)是匿名方法是托管类型,而程序变量则不是。
'reference to'关键字比其他程序类型更通用。
匿名方法通常分配给某些东西,如下例所示:
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:您不能将匿名方法分配给常规方法指针。方法引用是托管类型,但方法指针是非托管类型。因此,出于类型安全原因,不支持为方法指针分配方法引用。例如,事件是方法指针值属性,因此您不能对事件使用匿名方法。有关此限制的详细信息,请参阅有关变量绑定的部分。