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

标签 delphi anonymous-methods delphi-10-seattle

我正在使用工具 MapFileStats从 delphi 检查生成的 map 文件。我发现匿名方法会生成某种元数据,这似乎与 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

最佳答案

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

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

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

添加到第二个程序时,输出为:
TDemo.Demo$0$ActRec

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

关于delphi - 匿名方法生成什么样的元数据?有没有办法删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34897954/

相关文章:

使用 XSLT 3.0 的 JSON 到 XML - 如何加载 JSON 源并调用 json-to-xml 函数?

sql-server - 在 Delphi 中使用 ADOConnection 查看 'print' 语句的输出

android - Delphi Android 应用程序启动后崩溃

delphi - 在 IDE 对象检查器中动态显示/隐藏属性?

delphi - 如何在不更改库文件的情况下修改Delphi库文件中的常量?

file - TSearchRec Delphi 向后

sql-server - 从数据库读取 NVARCHAR 后,TClientDataset Widestring 字段的大小加倍

c# - 隐式转换为 Func

c# - C#取消订阅匿名方法

c# - 匿名方法最短语法