运算符速查
Dart 大部分运算符与 C/Java 风格语言一致,同时新增了若干空安全与级联相关的运算符。下表按优先级从高到低列出常见分类。
类别 | 示例 |
---|---|
访问/后缀 | expr++ expr-- obj.method() list[i] obj?.field |
前缀一元 | -expr !expr ~expr ++expr --expr |
乘法 | * / % ~/ |
加法 | + - |
位运算 | << >> >>> (Dart 2.14 起) & ^ ` |
比较/类型测试 | >= <= > < == != as is is! |
逻辑 | && ` |
条件 | condition ? expr1 : expr2 |
级联 | .. ?.. |
赋值 | = += -= *= /= %= ??= ..= (Dart 3.0 起)等 |
算术与自增/自减
void main() {
assert(5 / 2 == 2.5);
assert(5 ~/ 2 == 2); // 整除
assert(5 % 2 == 1);
var a = 0;
var b = ++a; // 前缀:先自增再赋值
var c = a++; // 后缀:先取值再自增
assert(b == 1 && c == 1 && a == 2);
}
dart
比较与类型测试
==
会调用左操作数的==
方法;注意确保重写==
时同时实现hashCode
。is
/is!
用于运行时类型检查。as
进行类型转换,空安全下若转换失败会抛出异常;从 Dart 3.12 起还可使用value as? Type
获取可空结果。
bool sameType(Object? value) => value is num && value is! double;
dart
空安全相关运算符
运算符 | 说明 | 示例 |
---|---|---|
?. | 若左侧为 null,则整个表达式为 null | user?.profile?.name |
?.. | 级联的空安全写法 | builder?..reset() |
?? | 左侧为 null 时返回右侧 | title ?? 'Untitled' |
??= | 仅在变量为 null 时赋值 | cache ??= load(); |
! | 非空断言,告诉编译器该值不为 null | lateValue! |
... / ...? | 展开集合(可空版本需 ...? ) | final all = [...items, ...?optional]; |
逻辑运算符
短路逻辑与/或沿用 C 系列语言语义:
if (cache != null && cache!.isValid) {
// 第二个条件仅在 cache 非 null 时求值
}
dart
级联(Cascade)运算符
..
可以对同一个对象执行一系列操作并返回该对象本身;?..
在对象为 null 时跳过表达式。
final buffer = StringBuffer()
..write('Hello')
..write(' Dart');
Person? maybePerson;
maybePerson?..reset()..activate(); // 避免空指针
dart
赋值与复合赋值
除了常见的复合赋值(+=
、-=
等),Dart 还支持:
??=
:仅在变量为 null 时赋值。..=
(Dart 3):执行级联并返回级联结果,常用于构造临时对象。
final config = (Settings()..theme = 'dark')..freeze();
dart
位运算
void main() {
const value = 0x0F;
assert((value << 4) == 0xF0);
assert((value & 0xF0) == 0);
}
dart
自定义操作符
类可以通过重写以 operator
关键字声明的函数来自定义部分运算符:
class Vector {
final double x, y;
const Vector(this.x, this.y);
Vector operator +(Vector other) => Vector(x + other.x, y + other.y);
Vector operator -(Vector other) => Vector(x - other.x, y - other.y);
}
dart
掌握这些运算符及其优先级有助于编写更简洁、可读的 Dart 代码。
示例扩展(保留旧笔记里的案例)
级联与条件运算符示例
void main() {
final buffer = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
buffer.write('!');
}
print(buffer.toString());
final isLoading = true;
final status = isLoading ? 'Loading...' : 'Done';
print(status);
}
dart
赋值与可选赋值
void main() {
int? a;
int? b = 10;
a ??= 5; // a 为 null,赋值 5
b ??= 5; // b 不为 null,保持 10
print('a=$a, b=$b');
var total = 0;
total += 5;
total *= 2;
print(total); // 10
}
dart
关系与逻辑示例
void main() {
final result = 5 % 2 == 1 && 4.isEven;
print(result); // true
final num value = 42;
if (value is int) {
print('value 是 int');
}
}
dart
↑