Types 当声明局部变量时,它';最好在Dart中声明类型或只使用'var'?

Types 当声明局部变量时,它';最好在Dart中声明类型或只使用'var'?,types,dart,var,Types,Dart,Var,在dart中,有一个var,表示动态类型 当声明局部变量时,我可以写: String name=“Freewind”; 或 var name=“Freewind”; 起初我认为它们是一样的,因为编辑器应该能够推断出名称的类型是字符串,但我很快发现: void hello(字符串名){print(“hello,$name”);} int n=123; 你好(n);//编辑将在这里给出警告 var m=456; 你好(m);//但不会在这里 我尝试了DartEditor(基于eclipse)和

在dart中,有一个
var
,表示
动态类型

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

String name=“Freewind”;

var name=“Freewind”;
起初我认为它们是一样的,因为编辑器应该能够推断出
名称
的类型是
字符串
,但我很快发现:

void hello(字符串名){print(“hello,$name”);}
int n=123;
你好(n);//编辑将在这里给出警告
var m=456;
你好(m);//但不会在这里
我尝试了DartEditor(基于eclipse)和IDEA,发现两者都没有在
hello(m)
上给出警告。似乎他们将
m
视为
dynamic
,而不是
int
,因此他们不会发出警告

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

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

来自Dart常见问题解答:

Dart有类型推断吗

类型推断不是由语言规范指定的,而是实现可以自由执行的。重要的是要记住,Dart有一个动态类型系统,因此类型推断与Haskell等语言中的作用不同。然而,Dart编辑器确实会进行一些类型推断,例如当您对局部变量使用var时。我们期望Dart VM和dart2js在对性能或其他原因有用时使用类型推断


从省道样式指南:

更喜欢对局部变量使用不带类型注释的var

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


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

答:使用“var”的更好方法


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

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

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

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

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
你好(
name){…}
无效的
void
String
是类型注释,在生产模式下被忽略,但工具和人类都可以使用。

请检查一下-您的意思是
void hello(name:String)
无效hello(字符串名称)
?对不起,我把dart和scala混合了:)