模式切换
变量与常量
变量
变量是程序中存储数据的容器,Dart 中的变量使用 var
、明确类型、或 dynamic
声明。
变量声明方式
使用
var
- 自动推断数据类型,声明时必须初始化。
dartvar name = 'Alice'; // 自动推断为 String var age = 25; // 自动推断为 int
- 变量类型一经确定,后续不能赋值为其他类型。
下面的代码在 JavaScript 中运行是合法的,但在 Dart 中会报错。原因就是 Dart 是一种强类型语言,任何变量都是有确定类型的,变量类型一经确定,后续不能赋值为其他类型。
所以在 Dart 中使用
var
声明变量时,Dart 在编译时会根据变量的初始值自动推断变量的类型,在编译结束后,变量类型就确定了。而 JavaScript 是一种弱类型语言,变量的类型是在运行时确定的,所以 JavaScript 中可以随意改变变量的类型,var
只是声明变量的方式而已。dartvar value = 42; value = 'Hello'; // ❌ 编译错误:类型不匹配
使用具体类型
- 可以显式声明变量类型。
dartString name = 'Bob'; int age = 30; double height = 1.75; bool isStudent = true;
- 避免类型推断可能带来的困惑,代码更清晰。
使用
dynamic
dynamic
允许变量在运行时更改类型。
dartdynamic something = 'Hello'; something = 42; // ✅ 允许类型更改
- 使用
dynamic
会减少类型安全性,应谨慎使用。
未初始化的变量
- Dart 中未初始化的变量会有默认值:
- 数字类型默认为
0
。 - 布尔类型默认为
false
。 - 引用类型默认为
null
。
dartint x; // 默认值为 0 bool isTrue; // 默认值为 false String text; // 默认值为 null
- 数字类型默认为
变量作用域
- 局部变量:在函数或代码块中声明,仅在其作用域内有效。
- 全局变量:在函数外部声明,作用于整个文件。
常量
常量是指声明后值不能改变的变量,Dart 提供两种方式定义常量:final
和 const
。
使用 final
final
声明的变量在首次赋值后不能改变。final
的值可以在运行时确定。
dart
final name = 'Alice';
final currentTime = DateTime.now(); // ✅ 运行时确定
name = 'Bob'; // ❌ 编译错误:无法重新赋值
使用 const
const
声明编译时常量,值必须在编译期间确定。const
定义的值是不可变的,并且会被分配到编译时常量池中。
dart
const pi = 3.14159;
const items = [1, 2, 3]; // 编译时常量
const time = DateTime.now(); // ❌ 编译错误:值必须在编译时确定
final 和 const 的区别
特性 | final | const |
---|---|---|
值是否可变 | 不可变 | 不可变 |
值何时确定 | 运行时确定 | 编译时确定 |
使用场景 | 使用需要运行时计算的值 | 使用已知的编译时常量值 |
示例代码
dart
void main() {
// 使用 var 声明变量
var name = 'Dart';
print(name); // 输出: Dart
// 使用具体类型声明变量
int age = 25;
double height = 1.75;
bool isDeveloper = true;
print('Age: $age, Height: $height, Developer: $isDeveloper');
// 使用 dynamic 声明变量
dynamic variable = 'Hello';
print(variable); // 输出: Hello
variable = 42;
print(variable); // 输出: 42
// 使用 final 声明常量
final currentTime = DateTime.now();
print('Current Time: $currentTime');
// 使用 const 声明常量
const pi = 3.14159;
print('Pi: $pi');
}