5、Dart 变量

2022-07-19  本文已影响0人  Eyes_cc

详情请看 Dart 编程语言概览

一、目录

二、关键点

一、变量(用 vardynamic 或者具体的类型来声明一个变量)

Dart 是类型安全的语言,所有类型都是对象类型,都继承自顶层类型 Object,因此一切变量的值都是类的实例,即对象;甚至数字、布尔值、函数和 null 也都是继承自 Object 的对象。

1、 使用var 声明变量(类型推导)。

当使用 var 定义变量时,表示类型是交由编译器推断决定的。

  • 声明变量的时候如果没有赋值,那么值为null,并且之后可以赋不同的类型值。
  • 声明变量的时候如果已经赋值,那么变量的类型就确定了。

如:
var a; 方式一
var a = 100; 方式二

var name = 'coderwhy';
name = 'kobe';
print(name.runtimeType); // String
✅
void main() {
  var a; // 声明变量的时候如果没有赋值,那么值为null,并且之后可以赋不同的类型值。
  a = "hello word";
  print(a);
  a = 10; // 可以赋不同的类型值
  print(a + 10);
}

❌
void main() {
  var a = "hello word"; // 声明变量的时候如果已经赋值,那么变量的类型就确定了。
  print(a);
  a = 10; // 变量a的类型是String,不能将num类型的值赋给它
  print(a + 10);
}
: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
lib/main.dart:7
  a = 10;
      ^
2、 使用dynamic 声明变量。

声明变量的时候不管有没有赋值,之后都可以赋不同的类型值。因为会带来潜在的危险,在开发中, 通常情况下不使用dynamic,。

  • 声明变量的时候不管有没有赋值,之后都可以赋不同的类型值。

如:
dynamic a; 方式一
dynamic a = 100; 方式二

✅
void main() {
  dynamic a;
  a = "hello word";
  print(a);
  a = 10;
  print(a + 10);
}

✅
void main() {
  dynamic a = "hello word";
  print(a);
  a = 10;
  print(a + 10);
}
3、使用明确的类型声明变量

当然你也可以用具体类型去定义变量,更清楚地跟 编译器 表达你的意图,这样编辑器和编译器就能使用这些具体类型向你提供代码补全 或 编译警告的提示了。

如:
num a; 方式一
num a = 100; 方式二

二、常量(用finalconst来声明一个常量)

如果你想定义不可变的变量即常量,则需要在定义变量前使用 finalconst 关键字替代var具体的类型:

  • const 表示必须用常量值或常量表达式初始化,且不能被再次赋值;适用于定义编译常量(字面量固定值)的场景;
  • final 表示可以在声明时或者运行时赋值,只能被赋值一次。适用于定义运行时常量的场景。但是如果声明时就赋值的话,编译器就会提示使用const

如:
const num a = 100; 方式一const 表示必须用常量值或常量表达式初始化,且不能被再次赋值
const a = 100; 方式二const 表示必须用常量值或常量表达式初始化,且不能被再次赋值

final num d; 方式一final 表示可以在声明时或者运行时赋值,只能被赋值一次
final d; 方式二final 表示可以在声明时或者运行时赋值,只能被赋值一次
d = 100;

:只能赋值一次
❌
void main() {
  final c = "hello world";
  c = "hello";
  print(c);
}
: Error: Can't assign to the final variable 'c'.
lib/main.dart:7
  c = "hello";
  ^
  • final 和 const 有什么区别呢?
    const在赋值时, 必须用常量值或常量表达式初始化,且不能被再次赋值;
    final在赋值时, 可以动态获取, 比如赋值一个函数。

例子:

String getName() {
  return 'coderwhy';
}

main(List<String> args) {
  const name = getName(); // 错误的做法, 因为要执行函数才能获取到值
  final name = getName(); // 正确的做法
}
  • const放在赋值语句的右边,可以共享对象,提高性能。
    这里可以暂时先做了解,后面讲解类的常量构造函数时,我会再次提到这个概念。

例子:

class Person {
  const Person();
}

main(List<String> args) {
  final a = const Person();
  final b = const Person();
  print(identical(a, b)); // true

  final m = Person();
  final n = Person();
  print(identical(m, n)); // false
}
上一篇 下一篇

猜你喜欢

热点阅读