【问题标题】:Language question: record field with an anonymous record(?) as type...?语言问题:以匿名记录(?)作为类型的记录字段...?
【发布时间】:2019-01-15 17:50:02
【问题描述】:

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

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

    FAnonRec: record
      FAnonField: Integer;
    end;

    FField3: Boolean;
  end;

我的主要问题是:
1. 用语言术语,FAnonRec——或者更确切地说,它的类型——会被称为什么?我如何引用它? 匿名记录类型的记录字段之类的东西......?只是构造类型...? - 我在 Google 上搜索了一段时间,但不断得到有关古希腊历史的结果...我找到的最接近的是 this error explanation

其他问题:
2. 一般来说,这种类型的构造称为什么(“创建类型”,而不是使用预先声明的命名类型)? - 无论是在示例中使用还是在 var 块中使用,或者即使没有使用记录。
3. Delphi中的“结构”工具只显示FField1FField2:

- 但是“类资源管理器”工具显示了整个记录:

- 有人知道为什么吗?
4. 第 3 点以及这是来自一本旧书的事实以及我很难找到有关它的更多信息的事实让我想知道这种结构是否可能已经过时/不鼓励?

【问题讨论】:

  • 文档涵盖了这种结构,但没有命名。匿名记录类型或无名记录类型将对其进行描述。但是似乎没有正式的delphi名称。

标签: delphi record anonymous-types


【解决方案1】:

我称之为“嵌套记录类型定义”。它从 Turbo Pascal IIRC 开始就存在,与最近(至少在本世纪)引入的“匿名方法”无关,它是一个更复杂的野兽,因为它抓住了一些执行上下文。

我看不出有什么理由会让人觉得它过时或不受欢迎。从代码的角度来看,这是一个完美的有效结构,因为它在逻辑父字段中收集了一些字段。当然,如果您希望独立访问它,那么一个专门的类型定义是值得的。性能是一样的,只是YAGNI会更方便(打字少,整个记录一目了然)。

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

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

【讨论】:

  • 嵌套不是一个好的选择。您可以使用内联记录声明来定义局部或全局变量。同样是类中的一个字段。内联、匿名、无名都是更好的选择。
  • 我也称它们为嵌套记录。它们嵌套的并且它们不是无名的(上面的 FAnonRec 显然有一个名字)。 type 没有名称,但静态数组类型也没有,例如var A: array[1..2] of Integer;.
  • @Rudy 这个变量显然有名字。问题是关于类型。该类型没有名称。就类型而言,嵌套没有什么特别之处。如果这些类型的变量嵌套在复合类型中、声明为全局变量、声明为局部变量等,则这些类型的变量的规则是相同的。这种类型的特殊之处在于它被声明为 inline 并且是匿名的。我的意思是,您可能不会以任何方式将局部变量 var foo: record bar: integer; end; 称为嵌套。还是你说的是这个?
  • @David:我会将FAnonRec 称为嵌套记录(回答 #2)。实际上,该类型将是匿名的,但为此它是否嵌套并不重要。我不是特别喜欢 declared inline(尽管它可以被认为是正确的),因为这可能会导致与新的 inline 声明的 variables 混淆。
  • @Rudy No. 问题 2 是关于类型而不是变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2023-03-27
  • 2021-09-12
相关资源
最近更新 更多