Dart 语言详解
Dart 是 Google 开发的面向对象、强类型的编程语言,专为 跨平台应用开发 设计(如 Flutter 框架)。其语法简洁高效,支持 JIT(即时编译) 和 AOT(预先编译),兼具开发灵活性与运行性能。
Dart语言类型
Dart语言中是强引用类型,主要体现在以下几个方面:
1.类型系统特性
- Dart是静态强类型语言,变量类型在编译时确定且不可随意变更
- 支持类型推断,声明时可省略显式类型(如
var),但实际仍会推导为具体类型 - 默认非空安全,变量未初始化时为
null,通过?显式声明可空类型
2.内存管理机制
- Dart采用自动垃圾回收机制,所有对象默认都是强引用
- 基本类型(如
int、String)按值传递,对象类型按引用传递 - 提供
WeakReference处理特殊场景的弱引用需求
3.与动态类型的对比
- 虽然支持
dynamic类型实现动态特性,但会失去编译时类型检查 - 强类型设计可提高运行时性能,AOT编译能生成高效本地代码
- 类型系统在编译时捕获错误,比动态语言更安全
4.开发实践建议
- 推荐优先使用显式类型声明增强代码可读性
- 避免滥用
dynamic,仅在需要禁用静态检查时使用 - 利用泛型(如
List<int>)强化集合类型安全
Dart的常用数据类型
1.数值类型
-
int:表示整数值(如42) -
double:表示双精度浮点数(如3.14) -
num:int和double的父类,可存储任意数值
2.布尔类型
-
bool:仅包含true和false两个值
3.字符串类型
-
String:支持单引号、双引号和三引号表示法,支持插值表达式(如'Hello $name')
4.集合类型
列表(List):有序集合,类似其他语言的数组(如[1, 2, 3])
映射(Map):键值对集合(如{'name': 'Alice', 'age': 20})
集合(Set):无序且元素唯一的集合(如{1, 2, 3})
5.特殊类型
Runes:表示UTF-32编码的字符,用于处理特殊符号或表情(如\u{1f600})
Symbol:表示程序中的标识符,通过#前缀创建(如#mySymbol)
Null:表示空值,所有未初始化变量的默认值
注:所有类型均为对象,继承自Object,默认值为null。
Dart中变量声明
-
非空类型变量
- 所有声明为非空类型(如
int、String等未加?修饰的类型)的变量必须立即初始化 - 例外:函数内部的局部变量允许先声明后赋值,但使用前必须确保已赋值
- 所有声明为非空类型(如
-
final/const修饰的变量
-
final声明的变量必须在声明时或构造函数中初始化,且只能赋值一次 -
const声明的编译时常量必须在声明时初始化(函数内部也必须初始化),且值必须是编译时可确定的常量
-
-
集合类型(List/Map/Set)
- 若声明为不可空类型(如
List<int>),必须立即初始化或赋予默认值[] - 可空类型(如
List<int>?)可不初始化,默认值为null
- 若声明为不可空类型(如
注意:所有未显式初始化的变量默认值为null(包括未启用空安全的情况),启用空安全后,非空类型变量若未初始化会导致编译错误。
Dart中的变量类型推断
Dart语言兼具动态类型和静态类型特性,其类型系统设计如下:
类型推断机制
- 使用
var声明变量时自动推断类型(如var name = "Dart"推断为String) - 未显式声明类型的变量在debug模式下默认为
dynamic类型
dynamic类型
-
允许运行时改变变量类型:
dynamic value = 42; // 初始为int value = "Now a string"; // 运行时切换为String 会失去静态类型检查的安全性
Dart中的变量关键字
late:延迟初始化:允许非空变量稍后初始化,但使用前必须赋值
late String description; // 声明时不初始化
void main() {
description = "Hello"; // 使用前必须赋值
}
dynamic
- 动态类型:关闭静态类型检查,允许运行时改变类型
- 与
Object区别:dynamic允许调用任意方法(可能引发运行时错误)
Object:所有Dart对象的基类:可存储任意类型值,但需显式类型转换才能调用方法
var:根据初始值自动推断类型,后续不可更改类型
final
- 运行时常量:值在运行时确定后不可变
- 允许在构造函数中初始化:
class test{
final String name;
test({required this.name}){}// 构造函数中初始化
}
const:编译时常量:值必须在编译时确定
?/??
- 声明可空变量:
String? name表示可能为null的字符串 - 安全访问:
obj?.method()在obj为null时不会抛出异常 - 提供默认值:
value ?? defaultValue当value为null时使用后者 - 链式操作:
a ?? b ?? c返回第一个非null值