• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi:ClassStaticMethods

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在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?


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
MATLAB读取TECPLOT笛卡尔网格三维流场数据发布时间:2022-07-18
下一篇:
Matlab中imshow()函数的使用发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap