我无法理解空检查与普通 if-case 语句的工作方式有何不同,以及何时以及为什么我会在普通情况下使用它。
doc提到使用此功能的好处之一是“匹配失败而不抛出。”
这是我的简短示例代码:
void test(String? fetchedData) {
if (fetchedData case final String name) {
log("My name is : $name");
}
if (fetchedData case final String name?) {
log("My name is : $name");
}
return;
}
如果将此代码与 VSCode 一起使用并将鼠标悬停在
$name
变量上,您将看到 VSCode 建议将两者类型提升为不可为 null 的 String
类型,并且可以安全地使用。null
或与 String
不兼容的类型,则 if 块将不会被执行,因为模式匹配将失败,并且不会抛出任何错误。
您引用的示例doc与您的示例略有不同,因为匹配的变量的type不固定(请参阅注释)。
为了展示空检查模式的有用性,可以修改您的示例:
void test(Object? fetchedData) {
print(fetchedData.runtimeType);
if (fetchedData case final nonNullData?) {
print(" fetchedData: $nonNullData");
}
}
和
void main() {
String? a;
final String b = 'Ben';
final c = 27;
test(a);
test(b);
test(c);
}
控制台输出如下:
Null
String
fetchedData: Ben
int
fetchedData: 27