Dart变量

在Dart 中,我们有多种方式来声明和使用变量

1、使用var 来声明一个变量,Dart 会自动推断出变量类型,语法如下:

var name = "hello"; //注意:Dart语句要以分号结尾

2、声明的时候指定类型为String,如图:

注意:var 和 String等类型不能同时使用,var是自动推断,String是显示指定,如下是错误的:

var String a = "hello"; //错误,var和String不能同时使用,int等其他类型也是一样

3、如果声明的变量的值为null,需要在类型后加问号,如图:

4、如果一个对象不限于单一类型,可通过Object来指定,但是需要判断类型,如图:

注:Dart3后不推荐使用了,可通过泛型替代,除非与某些原生平台交互​​(如通过 dart:ffi 调用 C 函数)

5、如果一个变量在初始化后值不再改变,我们可以使用final 或const 声明它,但是final和const有点区别

  • const是编译时常量,在编译之前就要指定值,不能在运行过程中指定
  • final和const都是一旦设置了值就不能改变
  • 如果 const 变量在类级别,请将其标记为 static const

下面例子中final在运行时候指定的值不会报错,但是const就会报错,如图:

任何变量都可以拥有常量值,如图:

final 关键字用于声明一个不可变的变量,但这个变量可以引用一个可变的对象。换句话说,虽然 final 变量本身不能被重新赋值,但它的字段(即对象的属性)仍然可以被修改。下面是不可变变量引用可变对象的例子,如图:

const 对象及其字段都不能被改变:它们是不可变的,下面是不可变变量引用不可变对象的例子,如图:

  • 使用 const 时,对象的字段也必须是 final 的,以确保整个对象是不可变的

6、late 关键字用于声明 ​​延迟初始化​​ 的非空变量,如图:

  • 优势:避免使用可空类型(String?),同时允许延迟初始化
  • 如果变量​​可能永远不被初始化​​,应使用可空类型(String?)而非 late

如果使用late 声明变量没初始化,直接请求变量会报错,如图:

late变量默认为非空,因此不能声明后再次给变量赋值为null,如下:

late String name;
name = null;  //报错

如果需要为null的late变量,需要显式声明类型为可空,如下:

late String? name;  //加?表示可为空
name = null;       //不会报错

7、通配符变量(通配符变量要求语言版本至少为 3.7)

名称为 _ 的通配符变量声明了一个非绑定的局部变量或参数;本质上,它是一个占位符。如果存在初始化器,它仍会执行,但值不可访问。在同一命名空间中可以存在多个名为 _ 的声明,而不会发生命名冲突错误,顶层声明或可能影响库隐私的成员不适用于通配符变量,块范围内的局部变量可以用通配符,如下

for (var _ in list) {}   //for循环中使用
// try...catch中使用
try {
  throw '!';
} catch (_) {
  print('oops');
}

标签