delphi新语法 *****

关于delphi XE 新语法及性能的提高

for…in…语句

在Delphi2005中,新增加了一个非常有用的语句,这个特性在其他很多语言中都有,就是著名的foreach循环,越来越多的人发现这个有用的东西了,也越来越多的语言在编译器层面直接加入了对这个的支持了。

Delphi的编译器在集合类型,数组类型,字符串类型以及提供了GetEnumerator方法的类提供了for…in…的直接支持。


集合类型:

var chars:set of char;

 c:char;

begin

 chars:=[‘a’..’e’,’0’..’9’];

 for c in chars do

    ShowMessage(c);

end;


数组类型:

type

  TNumber=(Null,Eins,Zwei,Drei,Vier,Funf,Sechs,Sieben,Acht,Neun);

const

  NumberToEnglish:array[TNumber] of string=('Zero','One','Two','Three','Four','Five','Six','Seven','Eight','Nine');

var n:TNumber;

begin

  for n in [Low(TNumber)..High(TNumber)] do

  ShowMessageFmt('%s=%s',[GetEnumName(TypeInfo(TNumber),Ord(n)),NumberToEnglish[n]]);

end;


字符串类型:

var S:String;C:Char;

begin

 S:=’Hello World’;

 for C in S do

    ShowMessage(S);

end;


在VCL中,已经有如下类型已经提供了GetEnumerator方法:

TList 

TCollection 

TStrings 

TInterfaceList 

TComponent 

TMenuItem 

TCustomActionList 

TFields 

TListItems 

TTreeNodes 

TToolBar

 

 高速DELPHI程序技巧.内存方面

-----------------------------

1、对齐


  在内存中的数据应尽量按计算机位数对齐。

  32位机,所有的8/4字节数据,都按4字节对齐;10/6/2字节数据,按2字节对齐。

2、字符串

赋值使用注意事项如下:

  A、不同种字符串间赋值,将引起内存分配与复制;

  B、ShortString与ShortString之间赋值,将引起内存分配与复制;

  C、变量AnsiString与变量AnsiString之间赋值,不会引起内存分配与复制;

  D、常量AnsiString与变量AnsiString之间赋值,将引起内存分配与复制;

  E、WideString与WideString之间赋值,将引起内存分配与复制;


3、内存分配


  大量的相同大小块,尽量自己建立块分配器来分配,因为使用默认内存管理器,有二个问题:

  A、块会被加上块头(块大小,最少4字节),这将引起比较大的浪费

  B、由于内存管理器会有堆操作(查找/合并)与线程互斥,这将影响性能


4、抖动


  如果Pointer数组物理存储不连续,需要顺序访问,可能引起大量的内存页交换,会极大降低性能


2006新特性

1、操作符重载

2、类支持strict严格限制

    strict private        仅本类可见

    strict protected    仅本类及子类可见

3、类支持

    class var    类变量

    var        变量

    const        常数

4、类支持类属性

    class property ...

5、类支持Static类静态方法

    procedure method; static;     与类方法不同:没有Self,不能Virtual


   class procedure method; static;

  是一个静态方法,静态方法是方法的缺省类型,对它就像对通常的过程和函数那样调   
  用。编译器知道这些方法的地址,所以调用一个静态方法时它能把运行信息静态地链接进可执行文件。   
  静态方法执行的速度最快,但它们却不能被重写来支持多态性。   

6、类可以嵌套定义

7、使用Sealed产生密封类

  TTest = class Sealed(TBase)

  这样TTest将不能被继承

8、使用final产生终结方法

  TTest = class(TBase)

    procedure method; override; final;

  end;

  这样method将不能被继承

看看Delphi重载了多少个ifthen函数.

Math单元

function IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer= 0): Integer; overload; inline;

function IfThen(AValue: Boolean; const ATrue: Int64; const AFalse: Int64 =0): Int64; overload; inline;

function IfThen(AValue: Boolean; const ATrue: UInt64; const AFalse: UInt64 =0): UInt64; overload; inline;

function IfThen(AValue: Boolean; const ATrue: Single; const AFalse: Single =0.0): Single; overload; inline;

function IfThen(AValue: Boolean; const ATrue: Double; const AFalse: Double =0.0): Double; overload; inline;

function IfThen(AValue: Boolean; const ATrue: Extended; const AFalse:Extended = 0.0): Extended; overload; inline;

StrUtils单元

function IfThen(AValue: Boolean; const ATrue: string; AFalse: string = ”):string; overload; inline;

Delphi从2009之后增加了泛型,那么之前math,strutils单元的ifthen函数有很多种重载形式似乎就可以合并成一个单独的泛型函数了.

type

  TExtFuns = class

   class function IfThen(AValue: Boolean; const ATrue, AFalse: T): T; inline;

  end;

class function TExtFuns.IfThen(AValue: Boolean; const ATrue, AFalse: T): T;

begin

  if AValue then

    Result := ATrue

  else

    Result := AFalse;

end;

使用

var

  s : string;

  i : Integer;

  s := TExtFuns.IfThen(True, '条件成立', '条件不成立!');

  i := TExtFuns.IfThen(GetTickCount > 1, 1, 2);

还有更便捷的办法,从XE3以后扩展了新的Helper语法,可以给任意类型增加扩展函数.就有更方便的技巧了.

TBoolHelper = record helper for Boolean

  function IfThen(const ATrue, AFalse: T): T; inline;

end;

function TBoolHelper.IfThen(const ATrue, AFalse: T): T;

begin

  if self then

    Result := ATrue

  else

    Result := AFalse;

end;1

//使用

var

  s : string;

  i : Integer;

  s := True.IfThen('a','b');

  i := (gettickcount >1).IfThen(1, 2);//是不是很爽,方便程度不亚于C语言族系的?:语法吧.

end;

XE3之后的SysUtils单元里面内置了TBooleanHelper,TByteBoolHelper,TWordBoolHelper,TLongBoolHelper四个布尔类型的Helper,那么如果易博龙肯把ifthen集成到这四个辅助类上我们用起来就会更方便.

TNewClass = class(TObject)

 type//在类内部增加类型定义,不增加对象内存大小

     Trecord=record

      I:Word;    

     end;

   private

      fk:Integer;     

   public

      constructor Create; virtual;

      destructor Destroy; override;

   end;


原文地址:https://www.cnblogs.com/luckForever/p/7254591.html