[转]Delphi中record的用

于Delphi中之Record类型中,与的C语言对应之尽管凡布局体类型(struct),也或是为了顺应C语言或C++程序员的惯,对于她当Delphi中之采用在的有的问题进行开的印证。在Delphi中之记录体类型有半点栽艺术定义

Type

    RecTest = record (packed)

      ID :integer;

       Name :string;

      Descript:string;

    end;

的简单种档次的关键分在于在内存中之寄放,Packed是压缩类型的,可以省内存空间与寄存的半空中,但是它们定义好了相应的长度,所以不顶适合存放不自然长之数目,如string类型的数目;同时以动用记录体类型时专门而留心的凡用记录体数组的动静,使用不当不仅仅会面世性能方面的题材,同时也会发生意想不到的一无是处。如
RecList arrary[0..100] of
RecTest,如利用这样的概念之端,会起的题材来:

1.当用数组下标访问对应的记录体元素时,到后的数量记录走访时会愈来愈长,如RecList[89]
,它需要以RecTest中移动88只记录长度,由于RecTest是未自然长的,所以每次活动的长短也说不定未相同,所以导致定位数组中记录体时一贯时间长

2.当针对性记录体进行赋值时,如果想默认或忘记给某变量赋值,则会发生比较严重的结果,当使用到该变量时,可能会见读取到左的数值

若果得要是下记录体类型的,可以采取局部变通的章程,如运用数组指针,这样好大幅升级性,如对前的记录体数据情况,可以基本上定义一个指南针变量,如下:
PRecList = ^RecTest

     RecList arrary[0..100] of PRecList

这么定义相对的裨益就是每次运动时,只待走记录指针的长度数即可,即在现有的windows系统中,只待活动4各项即可。

故此对地方的问题,在先后开发中尽量少使记录体类型,直接定义一个遥相呼应的近乎即可,定义一个相应的接近处理的功利时,可以同当对象的付出的不二法门相平等,只不过是于记录体多矣创及自由而已,但相应的初始化或措施、属性在相近中充分爱实现,同时于程序的扩充类为异常轻处理,记录体可能会见比麻烦,如在记录体中益一个字段,那来或所有程序还需要扭转,但于目标被加进一个属性会显得挺便宜,同时为爱对目标吃之属性内容进行初始化处理。

旁:在对非自然长记录进行再次分配空间时,如增加一个长短的空中,在系面临的拍卖是优先开避一块内存地址保存时情又当斯基础及加一个长短的地方长度,即在相应的内存中需复制两只长的地址后才能够不负众望长长度。

补充1:

  1. 首先了解及record是可界定field的范围之,而且定义枚举类型的。

type TDateRec = record

Year: Integer;

Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);

Day: 1..31;

end;

  1. 好以匪定义结构体的景况下,直接当变量声明时使用。

var S: record

Name: string;

Age: Integer;

end;

  1. 下是变体部分,这是Delphi中变体在布局中之科班定义

type recordTypeName = record

fieldList1: type1;

fieldListn: typen;

case tag: ordinalType of

constantList1: (variant1);

constantListn: (variantn);

end;

Ø Tag可以概括

Ø constantList的路和ordinalType的路一致

Ø fieldList的档次不能够是long strings, dynamic arrays,
variants,也非克是含有这些的结 构体,但好是因于这些类别的指针

Ø Tag和constantLists
在编译器处理这些字段时没有用,只是也程序员理解时提供方便 (原文:The
optional tag and the constantLists play no role in the way the compiler
manages the fields; they are there only for the convenience of the
programmer.)

Ø
使用变体结构体的片个由:一个是索要不同的数额,但是同时未见面又要有所的字段。

type TEmployee = record

FirstName, LastName: string[40];

BirthDate: TDate;

case Salaried: Boolean of

True: (AnnualSalary: Currency);

False: (HourlyWage: Currency);

end;

Ø
另一个缘由是可管同的数目就如是不同之项目的数额。比如,你有一个64各之实数做啊率先独字段,你就是好管其的过人32员作为整数返回。这是Delphi帮助里说之。不绝尴尬出来,而且Real到Interger的变我吧酷少用。弄个Word到Byte的结构及经常那个常用。

Type

RConversion = record

Case Boolean of

True   : (aWord: Word;);

False   : (abyte bbyte : Byte;);

end;

这边附加一句观点,我跟四周的同事看这么的组织体会造成代码的易读性降低,一般以友好之代码中莫建议利用,当然为配合Windows的片构造除外,他自然就是是union当然就此如此的直接套用就可以了。

结构体的为主采用即是这么的。还有部分特的使用,比如“class-like”的结构体,和file
of record。

Class-like的结构体我未清楚啊时候用,既然要Create,用类似非就得矣。下面有首文章对公理来有阐述http://blog.csdn.net/maozefa/archive/2007/08/27/1760612.aspx。

File of
record,个人于欣赏,特别是在记录某种数据的时段,经常是将一个结构体整个写副到文件里,既贯彻了自然水准的加密,又简便好,读出来啊得一直放大上组织体里。这里就无详细描述了。

补充2:

delphi语言在风的Records类型的底蕴及搭了累累诸如类一样的高等级功能,如:Records可以产生性与道(包括组织constructors),类性质,类措施,类静态字段和内嵌类型。下面这示例演示定义一个效益像类一样的Records:
type
TMyRecord = record
    type
      TInnerColorType = Integer;
    var
      Red: Integer;
    class var
      Blue: Integer;
    procedure printRed();
    constructor Create(val: Integer);
    property RedProperty: TInnerColorType read Red write Red;
    class property BlueProp: TInnerColorType read Blue write Blue;
end;

constructor TMyRecord.Create(val: Integer);
begin
Red := val;
end;

procedure TMyRecord.printRed;
begin
writeln(‘Red: ‘, Red);
end;
尽管现在records能落实无数像样的特点,但它们和类似中或者生部分不比:
1 records不支持继承
2 records能含有variant
parts(呵呵,不知翻译成什么能说亮,就是case部分),类不可以
3
records是值类型,可以经过赋值拷贝,类是参照类型,因此无能够经过赋值来拷贝。
4 records在win32以及.net上允操作符重载,类就在.net上支持操作符重载
5
records使用一个缺少省之莫参数的构造函数(constructor)自动创建,而接近必须旗帜鲜明的创造。在record中用户定义的构造函数必须有一个还是多个参数。
6 record类型不可知起析构函数(destructors)
7
虚方法(那些指定了virtual、dynamic和message关键字之)不可知使以record类型中
8 record类型在win32开场上无克落实接口,在.net平台及会促成接口

record是因此来定义记录类型的..
切实就是像你开一个录入&查询学生基本状况的先后,你虽可以定义
student[50]:record
name:string;
age:integer;
weight:integer;
height:integer;
end;
下一场在主程序里而就是得按
student[12].name:=’yyydeyangzi’这样来吃它赋值了..读取、打印等操作类似..这即算是一定意义上之面向对象程序设计了…也就是说把student[12]作为一个靶,name、age、weight、height之类的即使是此目标的各种属性…
而以上是遵循pascal语法来说的,我本着Delphi没有啊研究,但大体上应有是同等的…