经过我写博客的总结: delphi 设计修饰符的目的 就是这样,就是想让你告诉编译器,参数是否会再函数内发生改变,或输出out。所以请养成习惯,不要省略。
1.无修饰符:
delphi会当成 unkown 来处理,这个时候 处理的很好,但是效率低(比如string等堆栈式存储的类型,他是会把指针复制一份入栈的,以防止你函数内部修改,因为一旦你函数内部修改了,为了避免影响原来调用此函数的函数内部的值跟着连带改变,所以他是把栈中的指针复制一份,若函数内部发生修改,就用这个新入栈的指针指向 新开辟的内存空间,这样不影响调用者内部的值发生连带改变。)可见delphi为了 开发者 设想的 很多啊,你少些了代码,delphi依然让你尽可能的不犯错,但是这是以牺牲效率为代价的。
2.const修饰符
若参数再函数内部 不会发生改变,那么尽量多用这个,因为这个是直接把变量的指针自身传递过去,并没有把指针复制一份入栈,即没有任何新入栈的数据,所以效率高。包括 类的属性、记录的成员变量、接口等。
都是这个规则。
3.var 修饰符
若参数 无论是string 还是 object 还是 interface 只要参数 需要再函数内部发生改变,那么就要 使用var 。var 也是直接传变量自身,没有复制变量指针新入栈。且允许 函数内部修改。
4.out 修饰符
我猜测delphi发明这个修饰符的目的是 让函数 可以对外输出一个实例变量。function abc(a: string): tobject; 与 procedure abc(a: string; out b: tobject) 相比,或许用out 更能节省前台的代码。
即使不是为了节省前台的代码,那么一个函数 如果想输出一个实例变量 也又多了一种方式。更加灵活。所以 如上 你如果想输出b ,那么请你 不要对b进行初始化,因为即使你初始化了,b进入方法abc后
之前的初始化也会被洗刷掉,那么又为何初始化呢,既然是函数向外输出,那么又为什么,你又要初始化后再传入函数呢。