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 := 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;
参考资料:
optimization - Does Delphi really handle dynamic classes better than static?
Delphi: Class Static Methods的更多相关文章
- Mongoose 'static' methods vs. 'instance' methods
statics are the methods defined on the Model. methods are defined on the document (instance). We may ...
- Java SE 8 docs——Static Methods、Instance Methods、Abstract Methods、Concrete Methods和field
一.Static Methods.Instance Methods.Abstract Methods.Concrete Methods ——Static Methods:静态方法 ——Instance ...
- Android JNI 学习(九):Static Fields Api & Static Methods Api
一.Accessing Static Fields(访问静态域) 1. GetStaticFieldID jfieldIDGetStaticFieldID(JNIEnv *env, jclass cl ...
- [React] Define defaultProps and PropTypes as static methods in class component
class Toggle extends Component { static propTypes = { defaultOn: PropTypes.bool, on: PropTypes.bool, ...
- Effective Java 01 Consider static factory methods instead of constructors
Advantage Unlike constructors, they have names. (BigInteger.probablePrime vs BigInteger(int, int, Ra ...
- Core Java Volume I — 4.4. Static Fields and Methods
4.4. Static Fields and MethodsIn all sample programs that you have seen, the main method is tagged w ...
- Difference Between static and default methods in interface
I was learning through interfaces when I noticed that you can now define static and default methods ...
- Static Fields and Methods
If you define a field as static, then there is only one such field per class. In contrast, each obje ...
- DELPHI学习---类和对象(五篇)
Classes and objects(类和对象) 类(或者类类型)定义了一个结构,它包括字段(也称为域).方法和属性:类的实例叫做对象:类的字段.方法和属性被称为它的部件(components)或成 ...
随机推荐
- 08-认识margin
1.margin margin:外边距的意思.表示边框到最近盒子的距离. /*表示四个方向的外边距离为20px*/ margin: 20px; /*表示盒子向下移动了30px*/ margin-top ...
- SpringBoot配置发送邮件
一.导入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- Python2 错误记录1File "<string>", line 1, in <module> NameError: name 'f' is not defined
Python 2下 count = 0 while count < 3: user = input('>>>') pwd = input('>>>') if ...
- C# 中奇妙的函数–String Split 和 Join
很多时候处理字符串数据,比如从文件中读取或者存入 - 我们可能需要加入分隔符(如CSV文件中的逗号),或使用一个分隔符来合并字符串序列. 很多人都知道使用split()的方法,但使用与其对应的Join ...
- javascript_ajax 地址三级联动
1.三级地址联动思路如下: 2.建立数据库.这里直接使用网上的地址数库,最后一个字段无用,先不去管它 3.建立一个server.php 文件 <?php // 数据库连接 mysql_conne ...
- C++中 int i 与 int &i 注意事项
来源:http://blog.csdn.net/qianchenglenger/article/details/16949689 1.int i 传值,int & i 传引用 int i不会回 ...
- IE9及以下版本获取上传文件的大小
IE9及以下版本不能识别files属性:获取图片需要设置浏览器 打开IE_工具_internet选项_安全_自定义级别. 启用ActiveX,开启跨域: var fso=new ActiveXobje ...
- 在服务器上同时启动多个tomcat
我所用Tomcat服务器都为zip版,非安装版.以两个为例:安装第二个Tomcat完成后,到安装目录下的conf子目录中打开server.xml文件,查找以下三处:(1) 修改http访问端口(默认为 ...
- servlet(2)response常用方法
详细的response 学习笔记是: 输出到前台的的方法 1:使用OutputStream流向客户端浏览器输出中文数据 2:使用PrintWriter流向客户端浏览器输出中文数据 3:使用Output ...
- ztree根据treeId展开指定节点并触发单击事件
ztree.expandNode(ztree.getNodeByParam("id",treeId,null));//展开指定节点 ztree.selectNode(ztree.g ...