Dart 之变量与常量

359 阅读4分钟

Dart之变量与常量.png

前言

Dart既属于动态类型语言又属于静态类型语言,因此具有动态语言和静态语言的特性,这意味着在编程时可以根据需要进行选择显式声明和隐式声明。显式声明比较好理解,就是在编写代码时需要确定变量的类型,而隐式声明则不需要编写代码时给定,而是由编译器在运行时自动推断出变量的类型。

一、变量

1.1 变量的定义

变量可理解为存储数据的一个容器。由一个名称数据类型组成,其值可以在程序运行时不断地更改赋值

1.2 变量的特点

变量包括命名规则、内存限制、可变性、及作用域与生命周期。这样一看比较晦涩难懂,我们来先看一张图片。

储物柜.png 你没有看错,这就是超市的储物柜。它和变量的特点有什么关系呢?

让我们一起来联系一下:

储物柜是一个存储物品的箱子,而变量是一个存储数据的容器。是不是觉得有联系啦?我们一起来看一看是不是这么一回事。

  • 命名规则: 储物柜上面都有一个唯一的标识,也就是它的号码。这个号码的命名好像有一定规则(都是按照数字排序的),回到我们的变量,变量一样的也拥有自己的一套命名规则(标识符命名规则)。
  • 内存限制: 看到这个储物柜了吗?它好像只能放一些比较小的物品,放置过大的物品则放不下,存储空间限制了它不能存放的物品。变量也是拥有这样的限制(内存限制),变量受限于数据类型,如果你放置一个超过数据类型范围的数值可能会引发一些问题,因此我们需要特别关注变量的内存限制,注意数据类型的取值范围。
  • 可变性: 储物柜在空间允许的情况下可以放置各种各样的物品,如书籍、包包等,放置的东西是变化的,可以根据需要进行更改放置的种类。变量亦同,可以进行更改其内容,或重新放置内容。
  • 作用域和生命周期: 储物柜也不能一直使用,从它的开始使用的那天起,直到它不再被使用的那天。这就是储物柜的作用域,储物柜的生命周期。变量的作用域就是变量的作用范围,变量的生命周期就是变量从创建到销毁不再使用的过程。

1.3 声明及初始化

1.3.1 显示声明

数据类型+变量名

示例:

void main() {
    int a = 10;
    double b = 23.4;
    String s = 'hello,Dart!';
}

1.3.2 隐式声明

由编译器在运行时自动推断出变量的类型。

1.3.2.1 var
  • 声明变量,在编译时自动推断出其类型。
  • 当推断出类型后,其类型不可再更改。
  • 编译时检查。
  • 只推断一次。
  • 适用场景: 不能确定变量类型时使用。

示例:

var示例.png

1.3.2.2 dynamic
  • 声明变量,在运行时自动推断出其类型。
  • 运行时检查,编译时不检查。
  • 适用场景: 声明时不能确定变量类型时和需要在运行时进行检查的变量声明。

示例:

dynamic示例.png

1.3.2.3 final
  • 声明不可变的变量,在运行时自动推断出其类型。
  • 可以先声明,后初始化。
  • 运行时检查,编译时不检查。
  • 适用场景: 声明变量并初始化后不再赋值。

示例:

final示例.png

1.3.2.4 const
  • 声明编译时常量,可隐式声明,隐式声明时自动推断出其类型
  • 声明的同时必须进行初始化。
  • 编译时检查。
  • 适用场景: 声明常量时。

示例:

const示例.png

1.3.2.5 late
  • 声明非空变量;
  • 延迟初始化
  • 运行时检查,不初始化就使用会报错。
  • 适用场景: 延迟初始化非空变量的场景。

示例:

late示例.png

运行时报错。

late示例1.png

二、常量

2.1 常量的定义

常量是一种特殊的变量,赋值后在程序运行过程中不会改变。

2.2 常量的特点

2.2.1 命名规则

  • 大写字母加下划线;
  • 例如:MAX_LENGTH;

2.2.2 不可变性

  • 常量一旦声明,并初始化后常量的值不会更改

2.3 常量的声明与初始化

使用const与final声明。

  • const:编译时常量。
  • final:运行时终量。

三、全局变量与局部变量

  • 全局变量

    • 在整个程序运行期间都可见。
    • 在整个程序运行期间都存在。
  • 局部变量

    • 在函数或代码块中可见。
    • 在函数或代码块进入时创建,在函数或代码块退出时销毁。

四、总结

本小节首先通过超市储物柜的例子来介绍变量的定义与特点,其次介绍了变量的声明与初始化,然后介绍了一种特殊的变量——常量,最后简单介绍了全局变量与局部变量。