第一节:变量
在 Dart 中,变量用于存储数据。Dart 是一种强类型语言,这意味着每个变量都有一个明确的类型。尽管 Dart 有类型推断的功能,但理解并正确使用变量的声明和类型是非常重要的。
1. 变量的声明
Dart 中声明变量的常用关键字有 var
、final
和 const
。
1.1 使用 var
声明变量
var
关键字用于声明一个变量,变量类型可以根据初始化值自动推断。
var name = '张三'; // Dart 会自动推断 `name` 的类型为 `String`
var age = 25; // Dart 会自动推断 `age` 的类型为 `int`
1.2 使用 final
声明不可变变量
使用 final
声明的变量只能赋值一次,之后不能再修改该变量的值。
final city = '北京'; // city 的值不能再被更改
1.3 使用 const
声明编译时常量
const
关键字声明的变量在编译时就已确定为常量,不能被修改。const
常量与 final
的区别是:const
是编译时常量,final
是运行时常量。
const pi = 3.14159; // pi 的值在编译时就被确定了
2. Dart 的类型系统
Dart 是一种强类型语言,但它也支持类型推断。如果希望显式声明变量的类型,可以在变量名前添加类型:
String greeting = '你好,世界';
int year = 2024;
bool isDartFun = true;
Dart 的基本类型包括以下几类:
类型 | 描述 | 示例 |
---|---|---|
int | 整型,表示整数 | int age = 30; |
double | 浮点型,表示带小数点的数字 | double price = 12.99; |
String | 字符串,表示文本数据 | String name = 'Alice'; |
bool | 布尔型,表示 true 或 false | bool isActive = true; |
List | 列表,表示有序的对象集合 | List<int> numbers = [1, 2, 3]; |
Map | 映射,表示键值对的集合 | Map<String, int> ages = {'Tom': 25}; |
3. 空安全(Null Safety)
Dart 提供了空安全(null safety)特性,帮助开发者避免空引用错误(即调用了 null
对象的成员)。在启用了空安全的 Dart 中,所有变量默认不能为 null
,除非你显式声明允许为 null
。
String? nullableName; // 可以为空的变量
nullableName = null; // 这不会报错
注意:使用 ?
标识符声明允许为空的变量。
4. 变量的默认值
在 Dart 中,未初始化的变量默认值为 null
,无论它的类型是什么(包括数字、布尔值、列表等)。如果变量类型不允许为 null
,则编译器会报错,必须进行初始化。
int? number; // 默认值为 null
print(number); // 输出: null
5. 延迟初始化变量(Lazy Initialization)
Dart 提供了 late
关键字用于声明延迟初始化变量。使用 late
关键字的变量在第一次使用时才会被初始化。它通常用于那些初始化开销大的变量,或者当你在声明时没有合适的初始值,但你可以确保在第一次使用前初始化该变量。
late String description;
void initialize() {
description = '这是一个延迟初始化的变量';
}
void printDescription() {
print(description);
}
void main() {
initialize();
printDescription(); // 这里才会初始化 description
}
使用 late
可以提高性能,避免不必要的初始化开销。
6. 动态类型
如果你希望一个变量可以存储任意类型的值,可以使用 dynamic
关键字。这会让 Dart 编译器跳过类型检查。
复制代码
dynamic anything = '这可以是任何类型';
anything = 123; // 现在变成了 `int` 类型
7. 变量的作用域
Dart 中的变量作用域指的是变量可见的范围。变量通常在声明它的代码块或函数内可见。
复制代码
void main() {
var message = 'Hello';
print(message); // 输出: Hello
}
// message 变量只在 main 函数内可见
小结
var
用于声明变量,Dart 会根据初始值推断其类型。final
声明的变量在运行时只能赋值一次。const
声明的变量是编译时常量,值不能修改。- Dart 支持类型推断,但也可以显式声明变量的类型。
dynamic
允许变量存储任何类型的数据。- Dart 的基本类型包括
int
、double
、String
、bool
、List
、Map
等。 - 空安全机制帮助防止
null
引用错误。 - 未初始化的变量默认值为
null
。 - 使用
late
声明的变量在第一次使用时才会被初始化。 - 变量的作用域通常限制在声明它的代码块内。