我有class field
someList : TList<SomeInterFace>;
我只需要在列表中存储对象并搜索它们,永远不想修改。所以我决定写
someList : TList<const SomeInterFace>;
但是我有很多编译错误。似乎不可能在标准Delphi容器中存储const对象?
const
仅在方法上下文中有意义:
procedure DoSomethingWithInterface(const AInterface: SomeInterface)
begin
// do something
end;
在这里,没有const
声明,接口的引用计数在传递给方法时递增,在方法返回时再次递减。使用const
时,接口通过引用传递,但不修改引用计数。这是有效的,因为当您还在方法内部时,接口的引用计数不可能下降,因此程序可以将方法内部的这种临时使用视为没有发生,从而节省了必须修改引用计数字段的开销。这里有更多的阅读
此外,在方法中使用const
的巨大节省是编译器在方法周围生成隐式try
/finally
块,否则将管理引用计数。在方法中使用const
可以节省try/finally的开销,这是主要的性能增益。但是,当向列表添加字符串或接口引用时,不会生成这样的隐式代码,因为开发人员完全控制列表中引用的生命周期,而不像传递给方法的参数,编译器必须管理。