Dart 变量

108 阅读3分钟

var

var可以自行推断出类型

main(List<String> args) {
  var name = 'Bob';
  
  var a = 1, b = 2, c = 3;
  var d, e, f;
  print("a=$a b=$b d=$d e=$e f=$f"); //a=1 b=2 d=null e=null f=null

  d = true;e = "123" ;f = 123;
  print("a=$a b=$b d=$d e=$e f=$f"); //a=1 b=2 d=true e=123 f=123
}

变量仅存储对象引用,这里的变量是 name 存储了一个 String 类型的对象引用。 “Bob” 是这个 String 类型对象的值 name 变量的类型被推断为 String 。 但是也可以通过指定类型的方式,来改变变量类型。 如果对象不限定为单个类型,可以指定为 对象类型 或 动态类型

dynamic

dynamic可以动态推断类型

dynamic name = 'Bob';

另一种方式是显式声明可以推断出的类型:

String name = 'Bob';

⚠️提示: 本页局部变量遵守 风格建议指南 使用 var。 理解:dynamic和Object

Final 和 Const

使用过程中从来不会被修改的变量, 可以使用 final 或 const, 而不是 var 或者其他类型

  • final 变量的值只能被设置一次
  • const 变量在编译时就已经固定 (const 变量 是隐式 final 的类型), 最高级 final 变量或类变量在第一次使用时被初始化
  • const 定义时,需要是个明确的值,不能像 final 那样,运行时才知道是什么值

⚠️提示: 实例变量可以是 final 类型但不能是 const 类型。 必须在构造函数体执行之前初始化 final 实例变量 —— 在变量声明中,参数构造函数中或构造函数的初始化列表中进行初始化

创建和设置一个 Final 变量

final name = 'Bob'; //⚠️ Without a type annotation 没有带类型批注
final String nickname = 'Bobby';


name = 'Alice'; //⚠️Error: 一个 final 变量只能被设置一次

什么时候用const?

  • 如果需要在编译时就固定变量的值,可以使用 const 类型变量
  • 如果 const 变量是类级别的,需要标记为 static const
  • 字面量的数字和字符串, 固定的变量,或者是用于计算的固定数字:
const bar = 1000000; // 压力单位 (dynes/cm2),定义常量值
const double atm = 1.01325 * bar; // 标准气压,值的表达式中的变量必须是编译时常量(bar)

const 关键字不仅可以用于声明常量变量。 还可以用来创建常量值,以及声明创建常量值的构造函数。 任何变量都可以拥有常量值。

// const [] 创建一个空的不可变列表 (EIA)
var foo = const [];  // foo 目前是一个 EIA.
final bar = const [];  // bar 永远是一个 EIA.
const baz = const []; // baz 是一个编译时常量 EIA.
const baz2 = []; // Equivalent to `const []` 相当于'const[]`

声明 const 的初始化表达式中 const 可以被省略。 比如上面的 baz。 有关更多信息,参考 DON’T use const redundantly ** 非 Final, 非 const 的变量是可以被修改的,即使这些变量 曾经引用过 const 值

foo = [1, 2, 3]; // 曾经引用过 const [] 常量值

不能改变final和const修饰的变量的值:

final bar = [1, 2, 3]; // 未处理的异常
const baz = [4, 5, 6]; // 未处理的异常

bar = []; // 未处理的异常
baz = []; // 未处理的异常

更多关于使用 const 创建常量值,参考 ListsMaps, 和 Classes

默认值

未初始化的变量默认值是** null**。即使变量是数字 类型默认值也是 null,因为在 Dart 中一切都是对象,数字类型 也不例外。

int lineCount;
assert(lineCount == null);

⚠️提示: 在生产环境代码中 assert() 函数会被忽略,不会被调用。 在开发过程中, assert(condition) 会在非 true 的条件下抛出异常.有关更多信息,参考 Assert