Dart语法基础系列三《常量变量》

2021-10-13 16:41:17 浏览数 (1)

基本语法,先从变量开始。

Dart 变量声明基础


声明一个字符串:

代码语言:javascript复制
main() {
  String str = 'hello wold';
  print(str);
}

同样可以使用const ,fiinal,var 来声明,由于不确定类型,会和TS、Swift、Kotlin一样类型推导

str 会被推导成字符串,然而并不会像js的var一样,dart 也是强类型语言。

默认值

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

代码语言:javascript复制
int lineCount;
assert(lineCount == null);

提示:语法检查不会让你使用null 的变量

dynamic 字段

dynamic 是动态的,类似于TS 和 Swift any 语法。编译期不做检查,在运行时决定类型。

代码语言:javascript复制
main() {
  // var str = 'hello wold';
  // str = 3;
  // print(str);

  dynamic a = 3;
  a = '33';
  print(a);
}

dynamic 灵活但存在风险,少用谨慎使用。

常量final const 比较


final 和 const 都可以修饰变量,达到不可以更改的目的。

const

如果需要在编译时就固定变量的值,可以使用 const 类型变量。 如果 Const 变量是类级别的,需要标记为 static const。 在这些地方可以使用在编译时就已经固定不变的值,字面量的数字和字符串, 固定的变量,或者是用于计算的固定数字:

修饰变量更改

const 修改变量,然后更改,会报错。

代码语言:javascript复制
main() {
  const name = 'zhangsan';
  name = 'lisi';
}

报错提示:Constant variables can't be assigned a value.

如果不初始化是否可以?

答案是不可以,const 必须初始化。

final

创建和设置一个 Final 变量:

代码语言:javascript复制
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
如果不初始化是否可以?
代码语言:javascript复制
main() {
  final name;
  name = '小明';
}
修饰变量更改
代码语言:javascript复制
main() {
  final name;
  name = '小明';
  name = '小红';
}

Final 和 Const 比较总结

使用过程中从来不会被修改的变量, 可以使用 final 或 const, 而不是 var 或者其他类型, Final 变量的值只能被设置一次; Const 变量在编译时就已经固定 (Const 变量 是隐式 Final 的类型.) 最高级 final 变量或类变量在第一次使用时被初始化。

const 在编译时确定,相同内容优先取内存已有地址。

代码语言:javascript复制
main() {
  List a1 = [1, 2, 3];
  List a2 = [1, 2, 3];
  print(identical(a1, a2));

  final a3 = [1, 2, 3];
  final a4 = [1, 2, 3];
  print(identical(a3, a4));

  const a5 = [1, 2, 3];
  const a6 = [1, 2, 3];
  print(identical(a5, a6));

  Array a7 = const Array.multi([1, 3, 4]);
  Array a8 = const Array.multi([1, 3, 4]);
  print(identical(a7, a8));
}

打印结果:

代码语言:javascript复制
false
false
true
true

static 修饰静态变量

使用 static 关键字实现类范围的变量和方法。

静态变量(类变量)对于类级别的状态是非常有用的:

代码语言:javascript复制
class Queue {
  static const initialCapacity = 16;
  // ···
}

void main() {
  assert(Queue.initialCapacity == 16);
}

静态变量只到它们被使用的时候才会初始化。

0 人点赞