声明局部变量时,最好在Dart中声明类型或只使用`var`?

Fre*_*ind 5 types var dart

在飞镖中,有一种var方法dynamic type.

声明局部变量时,我可以写:

String name = "Freewind";
Run Code Online (Sandbox Code Playgroud)

要么

var name = "Freewind";
Run Code Online (Sandbox Code Playgroud)

起初我还以为他们是一样的,因为编辑器应该能够推断类型name就是String,但我很快就发现:

void hello(String name) { print("hello, $name"); }

int n = 123;
hello(n);      // editor will give an warning here

var m = 456;
hello(m);      // but will not here
Run Code Online (Sandbox Code Playgroud)

我尝试使用DartEditor(基于eclipse)和IDEA,发现它都没有发出警告hello(m).看来,他们对待m作为dynamic,不int,所以他们不给警告.

如果我理解正确,我们应该尽可能多地声明类型以获得类型安全检查,对吧?但我喜欢var它因为它更短,不需要复制类型信息.

或者没有警告只是因为Dart的编辑不够强大,我们将来会收到警告?

mez*_*oni 7

来自Dart FAQ:

Dart有类型推断吗?

类型推断不是语言规范指定的东西,但它是实现可以自由执行的东西.重要的是要记住Dart具有动态类型系统,因此类型推理与Haskell等语言中的角色不同.但是,Dart编辑器会执行某些类型的推理,例如当您将var用于局部变量时.我们希望Dart VM和dart2js在对性能或其他原因有用时会使用类型推断.


来自Dart风格指南:

使用var的PREFER没有局部变量的类型注释

现代代码中的方法体往往很短,并且局部变量的类型几乎总是可以从初始化表达式中轻易推断出来,因此显式类型注释通常只是视觉噪声.体面的编辑器可以推断出局部变量的类型,并且仍然提供您期望的自动完成和工具支持.


问:声明一个局部变量时,最好var在Dart中声明类型或只使用它?

答:使用'var'的更好方法.


问:或者没有警告只是因为Dart的编辑不够强大,我们将来会收到警告?

答:当新的Dart编辑器分析仪得到全面实施和改进时,可能会在不久的将来到来.


Chr*_*ett 5

如果我理解正确的话,我们应该尽可能多地声明类型以获得类型安全检查,对吗?

有点。通过提供类型信息,您可以向工具和其他人提供有关您的意图的信息。使用您提供的任何类型信息取决于工具。

Dart 本身以两种模式运行 -检查模式或生产模式。当您从编辑器运行应用程序时,默认情况下它会在检查模式下运行。这可以在代码运行时有效地执行类型断言。上面给出的示例在没有警告的情况下通过了静态分析器,但在检查模式下无法运行。在生产模式下,它将尝试运行(在本例中将成功运行)。

通过成功运行,在生产模式下,您的代码将被视为

void hello(name) { print("Hello $name"); } // note the lack of type info on the signature

var i = 123;
hello(i); // "Hello 123"
Run Code Online (Sandbox Code Playgroud)

这实际上与 JavaScript 相同——它将一直运行到故障点。类型信息只是注释,形式化为语言,因此当您编写时

voidhello(Stringname) { ... } 和是在生产模式中被忽略的类型注释void,但可以被工具和人类使用。String