zoukankan      html  css  js  c++  java
  • Delphi: Class Static Methods

    在Delphi中,自Delphi 2007之后,支持static形式的class方法,样式比如:

     type
        TMyClass = class
          strict private
            class var
              FX: Integer; 
          strict protected
            // Note: Accessors for class properties
            // must be declared class static.
            class function GetX: Integer; static;
            class procedure SetX(val: Integer); static; 
          public
            class property X: Integer read GetX write SetX;
            class function GetInstance: TMyClass;
    class procedure StatProc(s: string); static;
    end;

    即在方法后面加入static关键字,区别于传统的class方法。

    一直不明白它与不加static关键字的方法有什么区别,而其官文档又语焉不详,看了又不够透彻,于是写代码验之,大致有点感悟。

    结合其官方说法,感觉加static的方法,更像是纯粹的静态方法,其与普通的class方法相比,不同有几点:

    1、其方法体内不以用Self关键字

        传统class方法可以在方法体内使用Self关键字,而其Self关键字,指的是类而非类实例。比如,它可以调用类的构造函数。

    2、其修饰的方法不能再加以virtual来修饰

        即它不能被子类改写。 

    3、类属性之存取方法,须得为static方法

    由上几点,感觉class static method主要用处就是做为类属性的访问器,以及纯粹的静态方法。

    其它用处,亦未知。 

    TMyClass类其实现代码如下:

    { TMyClass }
    
    var
      FMyClass: TMyClass;
    
    class function TMyClass.GetInstance: TMyClass;
    begin
      if FMyClass = nil then
        FMyClass := Self.Create;  //这里Self,指的是TMyClass类;在static方法中,无法用Self标记,即它也不能调用类的构造函数
      Result := FMyClass;
    end;
    
    class function TMyClass.GetX: Integer;
    begin
      Result := FX;
    end;
    
    class procedure TMyClass.SetX(val: Integer);
    begin
      FX := val;
    end;

    class procedure TMyClass.StatProc(s: string);
    begin
    ShowMessage(s);
    end;

     

    因为加static没有了Self指针指向,理论上说速度可能更快一些,做如下验证的确如此,但也不明显。

    速度测试: 

    class function GetDigit1(const Value: Integer): Integer;
    class function GetDigit2(const Value: Integer): Integer; static;
    
    ...
    
    { TMC}
    
    class function TMC.GetDigit1(const Value: Integer): Integer;
    begin
    X := X + 1;
    Result := Value + Value; end; class function TMC.GetDigit2(const Value: Integer): Integer; begin
    X := X + 1;
    Result := Value + Value;
    end;

     类调用,后者稍快一点:

    var
      i, ct: Integer;
    begin
      ct := GetTickCount;
      for i := 0 to 99999999 do
        TMC.GetDigit1(i);
      Edit1.Text := IntToStr(GetTickCount - ct);  //327ms
    
      ct := GetTickCount;
      for i := 0 to 99999999 do
        TMC.GetDigit2(i);
      Edit2.Text := IntToStr(GetTickCount - ct);  //296ms
    end;

     实例调用:

    var
      i, ct: Integer;
    begin
      ct := GetTickCount;
      for i := 0 to 99999999 do
        TMC.Create.GetDigit1(i);
      Edit1.Text := IntToStr(GetTickCount - ct);  //3432ms
    
      ct := GetTickCount;
      for i := 0 to 99999999 do
        TMC.Create.GetDigit2(i);
      Edit2.Text := IntToStr(GetTickCount - ct);  //297ms
    end;

     

    参考资料:

    Methods (Delphi) - RAD Studio

    optimization - Does Delphi really handle dynamic classes better than static?

  • 相关阅读:
    legend2---开发日志8(thinkphp和vue如何配合才能达到最优)
    英雄联盟:英雄台词翻译(我用双手成就你的梦想。)
    js插件---bootstrap插件daterangepicker是什么
    js插件---bootstrap-datepicker.js是什么
    ORDER BY RAND()
    Boost.Asio c++ 网络编程翻译(26)
    3Sum Closest
    hdu3480二维斜率优化DP
    MySQL Study之--Mysql无法启动“mysql.host”
    于PsIsSystemThread无论是在线程系统线程标识获得
  • 原文地址:https://www.cnblogs.com/crwy/p/9450633.html
Copyright © 2011-2022 走看看