用Flutter极速构建原生应用
上QQ阅读APP看书,第一时间看更新

2.2 Dart中的变量

讲到变量,相信有中学数学基础的读者都会非常熟悉。在数学中,变量是一个非常重要的概念,在方程组、函数中随处都可以见到变量的影子。在编程中,变量也是一个非常重要的概念。从字面上来理解,变量即表示可以改变的量值,其实有些不准确,变量更像是一个容器,用来存储数据,数据可能是可变的,也可能是不可变的,不同类型的数据对应不同类型的变量。Dart中的变量功能强大,本节我们就来学习变量相关的知识。

2.2.1 使用变量

在开始学习变量之前,我们先来分析一个简单的程序,代码如下:

这是一个非常简单的Dart程序,运行后不会有任何输出。然而麻雀虽小,五脏俱全。首先,任何一个Dart程序都需要一个入口函数,即main函数,和Java、C语言一样,不论main函数写在文件的哪个位置,在Dart程序执行时都会先找到它,上面的代码在main函数中创建并初始化了一个变量:name。需要注意,在每一句Dart语言的结尾都要使用符号“;”进行标记。

var关键字用来声明变量,var是一个非常有意思的关键字,在Dart中,变量都是有类型的,var关键字的作用是让解释器来推断变量的类型,在变量进行赋值时,解释器会根据赋值对其类型进行推断,上面的name变量会被推断成字符串类型(string)。变量的类型一旦确定,如果对其赋予了不同类型的值,就会产生错误,例如:

运行上面的代码,会报出如下错误:

    Error: A value of type 'dart.core::int' can't be assigned to a variable of type
'dart.core::String'.

这个错误的意思是将int类型的值赋给了string类型的变量,这在语法上是不被允许的。

和很多强类型语言一样,Dart也非常强调类型安全。很多时候,变量类型确定后,我们不需要将其他类型的值赋给它,但是总有特殊情况出现,如果某个变量的类型是可变的,在Dart中就可以使用dynamic关键字来声明,它的意思是变量的类型是动态的,例如:

    dynamic age = 26;
    age = "26";

当然,如果你想强制变量的类型,也可以在声明变量时显式地标注它的类型,比如:

    String subject = "Dart";

上面的代码显式地声明subject变量的类型为字符串类型(String类型)。

上面所有的示例代码中,在声明变量的同时都对其进行了赋值,这个过程也叫作变量的定义。当然,你也可以只对变量进行声明,并不赋值,这时变量会被设置为默认值null,例如:

    var uninit ;
    print(uninit);//将输出null

还有一点需要注意,在Dart中,无论什么类型的变量,如果不对其进行赋值,那么它的默认值都是null,这和一些类C语言不同,在Dart中,所有数据都是对象,请牢记,这点非常重要。

2.2.2 不可变变量

在开发中,很多时候有些数据是不可变的,例如一些配置项。对于不可变的变量,可以使用final或者const关键字。final关键字声明的变量为最终变量,const关键字声明的变量为常量。无论使用哪一个关键字,在声明时,都需要对变量进行赋值,例如:

    final a = 1;
    final String b = "sss";
    const c = 2;
    const int d = 3;

如果在声明时没有对其进行赋值或者在定义完成后又对其进行了修改,在运行时就会抛出异常。

在实际开发中,适当地使用final和const关键字十分重要。一些数学常数(例如标准气压、重力单位等)在程序中使用时都可以定义成不可变的变量。