匿名方法生成什么样的元数据?有没有办法删除它?

时间:2016-01-20 10:50:48

标签: delphi anonymous-methods delphi-10-seattle

我使用工具MapFileStats检查来自delphi的生成的地图文件。我发现匿名方法会生成某种元数据,这些元数据似乎与RTTI无关。它是什么类型的元数据?删除它会很好,因为在我们的生产环境中它总计很大。

示例代码:

program RttiDemo;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$WEAKLINKRTTI OFF}   

var
  AProc: TProc;

begin
  try

    AProc := procedure()
      begin
        // ...
      end;

  except
    on E: Exception do
      WriteLn(E.ClassName, ': ', E.Message);
  end;

end.

MapFileStats的屏幕截图:

Screenshot displaying MailFileStats

另一个例子:

program RttiDemo;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$WEAKLINKRTTI OFF}

type

  TDemo = class
    procedure Demo();
  end;

procedure TDemo.Demo;
var
  AProc: TProc;
begin
  AProc := procedure()
    var
      i: Integer;
    begin
      i := 5;
      WriteLn(i);
    end;

  AProc();
end;

var
  Demo: TDemo;

begin
  Demo := TDemo.Create();
  try
    Demo.Demo;
  finally
    FreeAndNil(Demo);
  end;
end.

截图:

another MapFileStats screenshot

1 个答案:

答案 0 :(得分:2)

匿名函数由一个类支持,该类实现匿名函数工作所需的接口。此处报告的元数据表示该类所需的信息。我不相信你可以从你的可执行文件中删除它。

以下将发出实现匿名方法的对象的类的名称:

Writeln((IInterface(Pointer(@AProc)^) as TObject).ClassName);

当添加到第二个程序时,输出为:

TDemo.Demo$0$ActRec

这与您在问题中突出显示的名称相同。