在DartPad中尝试:
dynamic是所有Dart对象的基础类型。在大多数情况下,您不需要显式使用它。
var是关键字,表示“我不在乎指出这里的类型”。 Dart会将var关键字替换为初始值设定项类型,如果没有初始值设定项,则默认情况下将其保留为dynamic。
如果希望变量赋值在生命周期内发生变化,请使用var:>
:>var msg = "Hello world."; msg = "Hello world again.";
如果希望变量赋值在其生命周期内保持不变,请使用final
final msg = "Hello world.";
自由地使用final
可以帮助您发现不希望改变变量分配的情况。
请注意,当涉及对象时,final和const
之间有很好的区别。 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
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不是我要问的问题。我想再问一下dynamic vs Object有什么区别。
这里是DO annotate with Object instead of dynamic to indicate any object is allowed.开始时很难感觉到,但是动态的我将涉及泛型类型参数。
在DartPad中尝试:
var
,类似于final
,用于声明变量。根本不是[[not
var a ;
a = 123;
print(a is int);
print(a);
a = 'hal';
print(a is String);