在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在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; 即在方法后面加入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;
因为加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
类调用,后者稍快一点: 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;
参考资料: optimization - Does Delphi really handle dynamic classes better than static? |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论