Delphi内联声明中应当优先使用const而非var吗?
是否应该优先选择内联const而非var?
在编译器版本支持、无兼容要求的场景下,你的思路完全正确:优先用const是更优的实践。它能明确向编译器和其他开发者传递「该标识符的引用不会被重新赋值」的意图,同时编译器会阻止你意外对该变量执行重赋值操作,降低不必要的bug概率。
UsingConst实现存在的弊端和风险
- 旧版编译器的初始化逻辑bug
内联声明是Delphi 10.3 Rio才引入的特性,在10.3的早期更新版本中,动态表达式初始化的内联const会被编译器处理为静态全局常量,仅在程序启动时执行一次初始化,而非每次进入函数时重新初始化。如果你的UsingConst函数被多次调用,dict会复用同一个实例,第二次调用时执行dict.Add ('one', 1)会直接抛出键重复的异常,和UsingVar的执行逻辑完全不一致。这个问题在10.4及之后的版本已经修复,但如果你的代码需要兼容旧版本编译器,这是致命的风险。 - 语义误导性
很多有其他编程语言背景的开发者会默认认为const修饰的引用指向的对象本身也是不可变的,看到const dict会误以为不能对字典执行增删改操作,但Delphi的内联const仅限制「不能给该标识符重新赋值新的引用」,对象内部的状态修改完全不受限制,容易给读代码的人造成误解。 - 极端场景的类型推断问题
在部分泛型方法返回值、匿名方法捕获变量的场景下,内联const的类型推断稳定性不如var,偶尔会出现编译器无法正确推导类型、报异常类型错误的情况,遇到这类场景只能换用var声明。
如果你所有的编译环境都已经升级到Delphi 10.4及以上版本,不需要兼容旧版编译器,那么你写的UsingConst实现没有功能性问题,可以正常使用,也更符合防御式编程的最佳实践。
内容的提问来源于stack exchange,提问作者Wouter van Nifterick
相关产品推荐
相关产品推荐

