内联变量是Delphi Rio 10.3中引入的功能,这个功能其实在其他语言中并不新鲜,在第一次接触Delphi的时候如果非要让我吐槽点儿什么的话那就是变量的声明
官方文档:http://docwiki.embarcadero.com/RADStudio/Rio/en/Inline_Variable_Declaration
内联变量声明
以前使用局部变量需要以下面的方式进行声明
procedure Test;
var
I: Integer;
begin
I := 22;
ShowMessage (I.ToString);
end;
现在使用内联变量的方式进行声明
procedure Test;
begin
var I: Integer;
I := 22;
ShowMessage (I.ToString);
end;
针对第一种声明变量的两点吐槽
(1)类似于 I 这种变量可能只是临时使用一下,然而它依然需要在前面提前声明,有的朋友可能会说这样的语法阅读性更高,但是当代码量大了反复拖动鼠标来查阅声明时的类型也很麻烦,个人反而觉得阅读性降低了
(2)变量的作用范围,变量只要声明那它的作用范围即为整个函数、过程,但是某些时候仅仅需要在循环或者 if 语句中使用变量,无形中造成了资源的浪费
参考阅读
变量范围
这里直接参考官方文档给出的代码示例
procedure Test; // 在单个语句中声明和初始化
begin
var I: Integer := 22;
ShowMessage (I.ToString);
end;
procedure Test1; // 多个内联声明
begin
var I: Integer := 22;
var J: Integer;
J := 22 + I;
var K: Integer := I + J;
ShowMessage (K.ToString);
end;
procedure Test2; // 范围仅限于本语句块
begin
var I: Integer := 22;
if I > 10 then
begin
var J: Integer := 3;
ShowMessage (J.ToString);
end
else
begin
var K: Integer := 3;
ShowMessage (J.ToString); // COMPILER ERROR: “Undeclared identifier: ‘J’”
end;
end;
在Test2这个过程中因为 J 和K 这两个变量是在对应的语句块中进行的声明,所以当超出了 f 语句范围外是无法进行访问的,同理 J 是在 if 块中声明的在else块内无法访问
类型推断
使用一些不熟悉的API时在定义接收其函数返回值的变量时需要反复的查看该函数的返回值类型是什么。不知道大家有没有感觉,反正我是被烦的不行。不过还好内联变量最后的一个特点就是可以进行类型推断(或者称为类型推导)。具体是什么东西看下面的代码
procedure NewTest;
begin
var MyDictionary := TDictionary<string, Integer>.Create;
MyDictionary.Add ('one', 1);
var APair := MyDictionary.ExtractPair('one');
ShowMessage (APair.Value.ToString)
end;
MyDictionary和APair这两个变量在接收其返回值时并不需要声明类型,根据等号右边的函数可以自动推导出其类型是什么,这就是类型推导
当然了,虽然在声明变量的时候省去了类型的定义,但是还是需要知道它代表的是什么
内联变量在循环中的使用
个人感觉这是内联变量带来最便利的一个地方了。没什么废话,翠花上代码……
for var I: Integer := 1 to 10 do
...
for var Item: TItemType in Collection do
...
至此内联变量的介绍就全部结束了,但是需要注意的是虽然官方宣称在Delphi Rio 10.3这个版本中进行了内联变量的支持,但是实际的情况是IDE有BUG,当你在这个版本内使用的时候会有烦人的红线虽然编译可以通过。在Delphi Sydney 10.4中已经修复了这个问题