zoukankan      html  css  js  c++  java
  • 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;


  • 相关阅读:
    python之递归函数
    python之内置函数
    python之迭代器与生成器
    python之装饰器函数
    python之函数进阶
    python之初识函数
    一起学Android之Dialog
    一起学Android之Menu
    一起学Android之GridView
    一起学Android之ViewPager
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254591.html
Copyright © 2011-2022 走看看