假设我们需要在函数完成时执行一些代码,无论如何。 例:
void myFunc() async {
await myLock.acquire();
if(...) {
myLock.release();
return;
}
...
myLock.release();
}
许多语言的功能允许以更优雅的方式实现这一点,而不仅仅是在每个return
语句之前手动调用myLock.release()
(例如 Go 中的defer
)。在Dart中也有这样的事情吗?
Dart 没有 RAII。 相反,您需要使用try
-finally
。
(Dart最近(在2.17中)确实添加了Finalizer
,但是当对象被垃圾回收时,这些会触发,这可能会在某个非确定性时间发生,如果有的话。
仅作为记录,使用try
/finally
的示例:
void myFunc() async {
await myLock.acquire();
try {
if(...) {
return;
}
...
} finally {
myLock.release();
}
}
您希望在分配资源后启动try
,以便在分配引发时不会尝试释放。