函数调用前的感叹号是啥意思?
Posted
技术标签:
【中文标题】函数调用前的感叹号是啥意思?【英文标题】:What does the exclamation mark mean before a function call?函数调用前的感叹号是什么意思? 【发布时间】:2020-11-24 21:53:04 【问题描述】:我在关注 Flutter 的 PR 时遇到了这段代码:
if (chunkCallback != null)
chunkCallback!(0, 100);
chunkCallback
后面的感叹号是什么意思?我在 Google 上搜索的内容均无效。
【问题讨论】:
也可以写成chunkCallback?.call(0, 100);
谁投了反对票,如果你能解释一下,那会更有帮助,因为我可以改进我的问题。谢谢!
是的@lrn,这实际上是在 PR 中提出的,但我的问题是关于“!”。不过感谢您的建议!
if 语句不是已经将 chunkCallback 的类型更改为在花括号内不可为空吗?
【参考方案1】:
"!"
是一个新的 dart 运算符,用于将 nullable 类型转换为 non-nullable 类型。
阅读 here 和 here 了解声音空值安全性。
仅在您绝对确定该值永远不会为 null 并且不要将其与 conditional property access 运算符混淆时才使用它。
【讨论】:
如果方法为 null 并且我使用“!”调用它运营商,应用程序可能会崩溃。有没有办法安全地调用这个方法? @JAHelia 是的,检查可能包含该方法的变量是否不等于 null 正如@user13315601 的回答中提到的,您在谷歌上搜索的术语是“null-assertion-operator”【参考方案2】:chunkCallback
是对函数的可为空引用。
如果您确定 chunkCallback
在运行时不能为空,您可以通过添加 !
来“消除可空性”以使编译器满意
typedef WebOnlyImageCodecChunkCallback = void Function(
int cumulativeBytesLoaded, int expectedTotalBytes);
...
class Class1
final WebOnlyImageCodecChunkCallback? chunkCallback;
Class1(this.chunkCallback);
void test()
if (chunkCallback == null)
throw Exception("chunkCallback is null");
chunkCallback!.call(0, 100);
本质上,!
在这种情况下是一个语法糖
(chunkCallback as WebOnlyImageCodecChunkCallback).call(0, 100);
【讨论】:
终于有了一个理智、简洁、易懂的描述。【参考方案3】:我认为这是“消除可空性”的简写语法,根据文档:https://dart.dev/null-safety/understanding-null-safety#null-assertion-operator
【讨论】:
以上是关于函数调用前的感叹号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章