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

时间:2013-07-06 09:11:49

标签: types dart var

在飞镖中,有var表示dynamic type

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

String name = "Freewind";

var name = "Freewind";

起初我认为它们是相同的,因为编辑器应该能够推断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

我尝试使用DartEditor(基于eclipse)和IDEA,发现hello(m)都没有发出警告。他们似乎将m视为dynamic,而不是int,因此他们不会发出警告。

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

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

2 个答案:

答案 0 :(得分:7)

来自Dart FAQ:

Dart是否有类型推断?

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


来自Dart风格指南:

使用var而不使用局部变量的类型注释

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


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

答:更好的方式来使用'var'。


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

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

答案 1 :(得分:4)

  

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

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

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

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

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

var i = 123;
hello(i); // "Hello 123"

这实际上与JavaScript相同 - 它将一直运行到失败点。类型信息只是注释,形式化为语言,所以当你写

void hello( String name) { ... } voidString是在生产模式中忽略的类型注释,但工具和人类都可以使用