语言问题:类型为...的匿名记录(?)的记录字段?

时间:2019-01-12 08:29:02

标签: delphi record anonymous-types

我仍在学习Delphi / OP,偶然发现了以下(简化的)代码,这是一本古老的Delphi书中练习的一部分。

type
  TMyRec = record
    FField1: Integer;
    FField2: String;

    FAnonRec: record
      FAnonField: Integer;
    end;

    FField3: Boolean;
  end;

我的主要问题是:
1.用语言来称呼FAnonRec-或更确切地说,它的类型是什么?如何引用?类似于匿名记录类型的记录字段 ...?只是构造类型 ...? -我用问题搜索了一段时间,但一直得到有关古希腊历史的结果...我发现的最接近的是this error explanation

其他问题:
2.通常,这种类型的构造称为什么(在那时然后在那里而不是使用预先声明的命名类型的“创建类型”)? -无论是在示例中还是在var块中使用它,甚至不使用任何记录。
3. Delphi中的“结构”工具仅显示FField1FField2
delphi structure
-但是“类资源管理器”工具会显示整个记录:
Image
-有人知道为什么吗?
4.第3点以及这是一本旧书的事实,以及我很难找到有关它的更多信息这一事实,使我想知道这种结构是否已过时/陈旧?

1 个答案:

答案 0 :(得分:4)

我将其称为“嵌套记录类型定义”。它自Turbo Pascal IIRC诞生以来就存在,并且与最近(至少在本世纪之前)引入的“匿名方法”无关,这是一个更加复杂的野兽,因为它具有一些执行上下文。 >

我没有任何理由认为它可能已过时或灰心。从代码的角度来看,这是一个完美的有效结构,因为它在逻辑父字段中收集了一些字段,因此这是有意义的。当然,如果希望独立访问它,那么值得使用专用的类型定义。性能将是相同的,如果使用YAGNI(打字少,整个记录一目了然),它将更加方便。

因此,您可以从编写此类嵌套记录开始,然后在需要时定义一个专用类型,例如如果添加一些方法可以使您的代码更具可读性和可维护性。实际上,在类型定义中使用嵌套记录可以减少代码库中最终的代码更改,因为稍后添加显式类型定义不会破坏从现有代码访问其成员的方式。

请注意,有一个RTTI作为独立记录,以“主”记录(类似'__TMyRec_FAnonRec'之类的名字命名)。因此,从RTTI的角度来看,它不是匿名的。 ;)