在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 := to do
TMC.GetDigit1(i);
Edit1.Text := IntToStr(GetTickCount - ct); //327ms ct := GetTickCount;
for i := to do
TMC.GetDigit2(i);
Edit2.Text := IntToStr(GetTickCount - ct); //296ms
end;

实例调用:

var
i, ct: Integer;
begin
ct := GetTickCount;
for i := to do
TMC.Create.GetDigit1(i);
Edit1.Text := IntToStr(GetTickCount - ct); //3432ms ct := GetTickCount;
for i := to 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?

最新文章

  1. Android开发学习—— activity
  2. Nginx转发地址解决跨域问题
  3. [代码] 类似 YYText 将表情文本转换成表情字符
  4. mysql事件
  5. [NOIP2011普及组]瑞士轮 JAVA实现
  6. Echarts使用随笔(2)-Echarts中mapType and data
  7. flowplayer视频播放插件
  8. Hbase的架构原理、核心概念
  9. webpack热更新问题和antd design字体图标库扩展
  10. vue中 this.$set的用法
  11. C#.NET和C++结构体Socket通信与数据转换
  12. [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky
  13. 基于canvas+ajax+zui.js的蓄电池监控系统
  14. spring与struts简单整合案例
  15. 网络之NSURLSession
  16. 青蛙的约会---poj1061(扩展欧几里德)
  17. 使用Markdown语法画流程图
  18. YUM常用命令详解
  19. VK Cup 2016 - Round 1 (Div. 2 Edition) D. Bear and Polynomials
  20. unity3d vscode

热门文章

  1. Java读写avro例子
  2. C语言基础入门
  3. How to Pronounce Word vs. World
  4. 使用py2exe转换python文件为可执行程序
  5. OpenWrt上搭建纯L2TP服务器[ZT]
  6. Linux下GDB调试简单示例
  7. 25.week4 docker build 也就是创建自己的image 上传image到dockerhub 从dockerhub下载images
  8. Unity3D架构设计NavMesh寻路
  9. Eclipse里的代码光标变成一个黑色块
  10. 使用jquery如何获取现在时间、并且格式化