普通 if-case 模式和带有空检查子模式的 if-case 模式之间的区别

问题描述 投票:0回答:1

我无法理解空检查与普通 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 块将不会被执行,因为模式匹配将失败,并且不会抛出任何错误。

dart
1个回答
0
投票

您引用的示例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

© www.soinside.com 2019 - 2024. All rights reserved.