Late和final可以一起用吗?

Jon*_*han 8 dart dart-null-safety

我现在正在尝试 NNBD,我想知道您是否可以使用 new 关键字latefinal一起使用。

据我了解,late属性可以在任何地方设置。您基本上是在告诉分析器,使用时它不会为空。
我认为这在某些情况下有点危险。

所以我想知道是否可以late final在 NNBD 中添加 a ,这会告诉分析器该属性必须在类构造函数中初始化。

有一个类似的问题,但我想当时没有零安全性: Dart。后期初始化最终变量

lrn*_*lrn 8

您可以声明一个late final变量。

如果您使用初始值设定项声明它,late final foo = computeSomething();则它是一个惰性最终变量。您无法分配给该变量,但仅在第一次读取该变量时计算其值。(根据我的经验,这对于局部变量来说永远不是正确的选择,即使语言允许。如果您关心局部变量的延迟初始化,您几乎总是想知道它是否已初始化,而延迟变量则不会不会给你这些信息。代码是无序执行的,而且不允许你await在初始化表达式中使用,这也令人困惑)。

如果声明的late final变量没有初始值设定项,则允许对该变量写入一次。因为变量是late,所以编译器不会在编译时抱怨赋值,除非绝对确定您已经分配了该变量,并且仅当它是局部变量时(因为这是编译器尝试跟踪赋值的唯一变量)到)。

如果late final没有初始化器的变量是类的实例成员,则意味着该类接口具有 setter。你需要非常非常小心地暴露late final在类的公共 API 中(阅读:不要这样做!)

最好在内部使用后期变量并保护对字段的访问,这样您就可以确保没有人两次分配变量。后期最终变量的目标是如果它被分配两次则不会抛出异常。它不应该被分配两次。它的存在是为了允许代码由于某种原因知道编译器无法理解,变量只分配一次。因此,只允许访问后期最终变量的代码知道该原因并保持不变。


Nic*_*cer 1

简短的回答:不,您不会从分析器获得任何帮助。


来自 nnbd 语言规范:

如果具有不可空类型的顶级变量或静态变量没有初始值设定项表达式,则这是一个错误,除非该变量使用 Late 或 external 修饰符进行标记。

如果类声明声明一个具有潜在不可空类型且没有初始化表达式的实例变量,并且该类具有生成构造函数,其中该变量不是通过初始化形式或初始值设定项列表条目进行初始化,则这是一个错误,除非该变量用 Late、abstract 或 external 修饰符标记。

late final int foo;基本上关闭了 的空感知foo。这似乎相当于在 Swift 中使用隐式展开的选项,如果您熟悉的话,这可能是危险的。

https://github.com/dart-lang/language/blob/master/accepted/future-releases/nnbd/feature-specification.md

除此之外,静态分析器不会警告您尝试重置late final.

令 D 为名为 的late局部final变量声明v。这是一个运行时错误,如果之前已将值分配给LateInitializationError,则会抛出 , 的实例来为其分配值。vv

https://github.com/dart-lang/language/blob/master/accepted/future-releases/nnbd/feature-specification.md#late-fields-and-variables

使用late意味着您需要确切地知道事物何时被初始化和使用。