Delphi 系统[18]关键字和保留字 record、packed -定义结构类型
Delphi 系统[18]关键字和保留字 record、packed -定义结构类型
1、定义:
- record :定义结构类型。 一个结构体可以视为一个不需要实例化的类(某些地方和对象用法不同)。
- packed :用于对结构类型对象或数组类型对象进行打包,打包后的对象体积能显著减小。打包后元素对齐位置也会发生变化,不再对齐到与 CPU 处理能力相匹配的位置,因此打包后的对象,处理速度会降低。详细信息请查阅相关资料。
2、示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | { 定义 record 类型 } type TMyRec = record Name: string ; Age: Cardinal ; Sex: Boolean ; end ; { 定义 record 类型,用法类似于 class } type TMyRec = record private FName: string ; public procedure ShowResult; property Name: string read FName write FName; end ; { 实现 record 方法 } procedure TMyRec . ShowResult; begin ShowMessage( '调用成功!' ); end ; { 调用 record 方法 } procedure TForm1 . Button1Click(Sender: TObject); var MyRec: TMyRec; begin MyRec . Name := 'Record 测试' ; ShowMessage(MyRec . Name); MyRec . ShowResult; end ; --------------------------------------------------------------------------------------- {packed 打包 } {结构化类型的实例包含多个值。结构化类型包括集合、数组、记录和文件以及类、类引用和接口类型。除了只包含序数值的集合外,结构化类型可以包含其他结构化类型;类型可以有无限的结构层次。 默认情况下,结构化类型中的值在单词或双单词边界上对齐,以便更快地访问。当您声明结构化类型时,可以将保留字打包以实现压缩数据存储。} type { 未打包 } TMyRecA = record Name: string ; Age: Byte ; Sex: Boolean ; end ; { 打包 } TMyRecB = packed record Name: string ; Age: Byte ; Sex: Boolean ; end ; { 未打包 } TMyArrayA = array [ 0 .. 32 ] of Byte ; { 打包 } TMyArrayB = packed array [ 0 .. 32 ] of Byte ; procedure TForm1 . Button1Click(Sender: TObject); begin ShowMessage(IntToStr(SizeOf(TMyRecA))); ShowMessage(IntToStr(SizeOf(TMyRecB))); ShowMessage(IntToStr(SizeOf(TMyArrayA))); ShowMessage(IntToStr(SizeOf(TMyArrayB))); end ; //使用压缩会减慢数据访问速度,对于字符数组,会影响类型兼容性(有关更多信息,请参阅内存管理) |
3、有关 record 的一些说明:
record(类似于某些语言中的结构)表示一组异构元素。每个元素称为一个字段;记录类型的声明为每个字段指定名称和类型。
记录类型声明的语法为:
1 2 3 4 5 6 | type recordTypeName = record fieldList1: type1; ... fieldListn: typen; end |
其中recordTypeName是有效标识符,每个类型表示一个类型,每个fieldList是有效标识符或逗号分隔的标识符列表。最后的分号是可选的。
例如,下面的声明创建了一个名为TDateRec的记录类型:
1 2 3 4 5 6 7 | type TDateRec = record Year: Integer ; Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); Day: 1..31 ; end ; |
- 每个TDateRec包含三个字段:一个名为Year的整数值、一个名为Month的枚举类型的值和另一个名为Day的介于1和31之间的整数。
- 标识符Year、Month和Day是TDateRec的字段标识符,它们的行为类似于变量。
但是,TDateRec类型声明不为年、月和日字段分配任何内存;实例化记录时会分配内存,如下所示:
1 | var Record1, Record2: TDateRec; |
此变量声明创建TDateRec的两个实例,称为Record1和Record2。
通过使用记录的名称限定字段指示符,可以访问记录的字段:
1 2 3 | Record1 . Year := 1904 ; Record1 . Month := Jun; Record1 . Day := 16 ; |
或使用with语句:
1 2 3 4 5 6 | with Record1 do begin Year := 1904 ; Month := Jun; Day := 16 ; end ; |
现在,您可以将Record1字段的值复制到Record2:
1 | Record2 := Record1; |
因为字段指示符的作用域仅限于它出现的记录,所以您不必担心字段指示符和其他变量之间的命名冲突。
您可以使用记录而不是定义记录类型。。。直接在变量声明中构造:
1 2 3 4 5 | var S: record Name: string ; Age: Integer ; end ; |
然而,这样的声明在很大程度上违背了记录的目的,即避免重复编码相似的变量组。此外,此类单独声明的记录将不具有分配兼容性,即使它们的结构相同。
创建时间:2021.08.12 更新时间:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
2020-08-12 Delphi XE10 错误提示:security alert vmware
2019-08-12 [原创]Delphi 字符串函数(字符串判断 TryStrToFloat 、TryStrToInt、TryStrToInt64、TryStrToBool、TryStrToCurr、TryStrToDate、TryStrToTime、TryStrToDateTime)