Dart中“ var”和“ dynamic”类型之间的区别?

问题描述 投票:36回答:5

根据this article

您可能知道,当没有提供静态类型注释时,dynamic(现在称为它)是替代类型。

所以dynamicvar有什么区别?什么时候使用?

dart
5个回答
35
投票

dynamic是所有Dart对象的基础类型。在大多数情况下,您不需要显式使用它。

var是关键字,表示“我不在乎指出这里的类型”。 Dart会将var关键字替换为初始值设定项类型,如果没有初始值设定项,则默认情况下将其保留为dynamic

如果希望变量赋值在生命周期内发生变化,请使用var:>

var msg = "Hello world.";
msg = "Hello world again.";

如果希望变量赋值在其生命周期内保持不变,请使用final

:>
final msg = "Hello world.";

自由地使用final

可以帮助您发现不希望改变变量分配的情况。

请注意,当涉及对象时,finalconst

之间有很好的区别。 final不一定使对象本身不可变,而const却做到了:
// can add/remove from this list, but cannot assign a new list to fruit.
final fruit = ["apple", "pear", "orange"];
fruit.add("grape");

// cannot mutate the list or assign a new list to cars.
final cars = const ["Honda", "Toyota", "Ford"];

// const requires a constant assignment, whereas final will accept both:
const names = const ["John", "Jane", "Jack"];

DartPad中尝试:

void main() {
  dynamic x = 'hal';
  x = 123;
  print(x);
  var a = 'hal';
  a = 123;
  print(a);
}

您可以更改x的类型,但不能更改a。

var,类似于final,用于声明变量。根本不是[[not

类型。
Dart足够聪明,可以在大多数情况下知道确切的类型。例如,以下两个语句是等效的:

String a = "abc"; // type of variable is String var a = "abc"; // a simple and equivalent (and also recommended) way // to declare a variable for string types

另一方面,dynamic是一种特殊类型,指示它可以是任何类型(aka类)。例如,通过将对象强制转换为dynamic,可以调用任何方法(假设有一个方法)。

(foo as dynamic).whatever(); //valid. compiler won't check if whatever() exists (foo as var).whatever(); //illegal. var is not a type

var a ; a = 123; print(a is int); print(a); a = 'hal'; print(a is String);
当没有初始值时,var是动态的

var b = 321; print(b is int); print(b); //b = 'hal'; //error print(b is String);

当使用初始值定义时,在这种情况下,var是int。 

相比之下,[[dynamic vs var
可以考虑的一个方面是在同时使用带有初始化的var声明时考虑了行为,在动态情况下,不可能更改类型。

但是dynamic vs var不是我要问的问题。我想再问一下dynamic vs Object有什么区别。

这里是DO annotate with Object instead of dynamic to indicate any object is allowed.开始时很难感觉到,但是动态的我将涉及泛型类型参数。


17
投票

DartPad中尝试:


9
投票

var,类似于final,用于声明变量。根本不是[[not


2
投票
var a ; a = 123; print(a is int); print(a); a = 'hal'; print(a is String);

0
投票
相比之下,[[dynamic vs var
© www.soinside.com 2019 - 2024. All rights reserved.