跟着老侯玩编程 跟着老侯玩编程
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
  • 基础语法

    • 单元文件
    • 变量和常量
    • 内联变量
      • 内联变量声明
      • 变量范围
      • 类型推断
      • 内联变量在循环中的使用
    • 基本数据类型
    • 复合数据类型
    • 语句(选择语句)
    • 语句(循环语句)
    • 数组
    • 初识例程
    • 初识面向对象
    • 属性Property
    • 面向对象的方法
    • 指针
    • 接口
    • 匿名函数和委托实现
    • 多态
    • 字符串详解
    • 异常处理
    • 反射机制
    • 泛型容器
    • JSON
    • 文件操作
    • Dll创建并调用
    • DLL初始化和退出处理
    • Package
    • 理解消息循环
    • VCL与Windows消息
    • 钩子原理
    • 进程通讯-内存映像
    • 多线程开篇
    • 线程控制
    • 线程同步
  • 网络编程

    • 网络编程基础
    • Delphi网络编程
    • select
    • WSAAsyncSelect
    • WSAEventSelect
  • 设计模式

    • 单例模式
    • 单例模式二
    • 策略模式
    • 简单工厂模式
    • 建造者模式
    • 原型模式
    • 模板方法模式
    • 状态模式
    • 迭代器模式
    • 解释器模式
    • 责任链模式
    • 中介者模式
    • 备忘录模式
    • 命令模式
    • 观察者模式
    • 访问者模式
    • 适配器模式
    • 桥接模式
  • Delphi
  • 基础语法
舞动的代码
2022-05-05
目录

内联变量

内联变量是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;
1
2
3
4
5
6
7

现在使用内联变量的方式进行声明

procedure Test;
begin
  var I: Integer;
  I := 22;
  ShowMessage (I.ToString);
end;
1
2
3
4
5
6

针对第一种声明变量的两点吐槽

(1)类似于 I 这种变量可能只是临时使用一下,然而它依然需要在前面提前声明,有的朋友可能会说这样的语法阅读性更高,但是当代码量大了反复拖动鼠标来查阅声明时的类型也很麻烦,个人反而觉得阅读性降低了

(2)变量的作用范围,变量只要声明那它的作用范围即为整个函数、过程,但是某些时候仅仅需要在循环或者 if 语句中使用变量,无形中造成了资源的浪费

参考阅读

  • 内联变量可以提高性能:https://blog.grijjy.com/2018/11/02/inline-variables-can-increase-performance/

# 变量范围

这里直接参考官方文档给出的代码示例

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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

在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;
1
2
3
4
5
6
7

MyDictionary和APair这两个变量在接收其返回值时并不需要声明类型,根据等号右边的函数可以自动推导出其类型是什么,这就是类型推导

当然了,虽然在声明变量的时候省去了类型的定义,但是还是需要知道它代表的是什么

# 内联变量在循环中的使用

个人感觉这是内联变量带来最便利的一个地方了。没什么废话,翠花上代码……

  for var I: Integer := 1 to 10 do
      ...

  for var Item: TItemType in Collection do
      ...

1
2
3
4
5
6

至此内联变量的介绍就全部结束了,但是需要注意的是虽然官方宣称在Delphi Rio 10.3这个版本中进行了内联变量的支持,但是实际的情况是IDE有BUG,当你在这个版本内使用的时候会有烦人的红线虽然编译可以通过。在Delphi Sydney 10.4中已经修复了这个问题

变量和常量
基本数据类型

← 变量和常量 基本数据类型→

Theme by Vdoing | Copyright © 2013-2023 冀ICP备16006233号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×