万物皆对象
在 Dart 中,万物皆对象,包括函数。
所有的对象都继承自 Object 类。
并且,所有对象的默认值都是 null。
void main() {
var test_var;
print("value = $test_var");
}
>>>
value = null
复制代码
如何声明变量
使用
var
关键字var name = 'Bob'; 复制代码
使用
var
可以声明一个不定类型的变量,但当该变量被第一次赋值时,该变量类型就被确定。从此,你不能再改变该变量的类型,任何错误的尝试,你都会得到编译器的报错。
eg:
name = 1; >>> A value of type 'int' can't be assigned to a variable of type 'String'. 复制代码
使用
dynamic
或Object
这两个家伙具有同样的效果!
它们都可以达到声明一个可变类型的变量的效果,即你可以随时使用该变量来指向任何一种类型的对象。
当然,编译器是不会告诉你你犯了任何的错误,它只会让你的代码被顺利的编译 ?
确切来说,
dynamic
实际上是一个关键字,而Object
之所以有同样的效果,完全是因为任何对象类型,都源自于它。所以你看,它两具有同样的效果,但具有不同的原理。
eg:
void main() { dynamic name = "Bob"; print("value = $name"); name = 1; print("value = $name"); } >>> value = Bob value = 1 复制代码
换成
Object
也会得到同样的结果。使用具体对象声明
String name = 'Bob'; 复制代码
对此,我想我不用有太多的解释。
使用
final
或const
如果你希望一个对象被初始化后,不能再被修改,那么你应该使用这两个关键字。
final name = 'Bob'; final String nickname = 'Bobby'; const bar = 1000000; const double atm = 1.01325 * bar; 复制代码
到现在为止,它两看起来没什么差别。
const 厉害的地方在于,它是编译时常量的关键字,你在编译期就需要确定它的初始值。
而 final 只会在运行时才要求确定初始值。
const
除了可以声明一个不可变的常量外,还可以用来创建常量数组。void main() { var userInfo = const []; final githuber = const ['CoorChice']; const nums = [1, 2, 3]; userInfo = ['bob', 2]; print(userInfo); } >>> [bob, 2] 复制代码
第一项之所能够被改变,是因为我们定一个是个
const []
常量数组。而剩余两项初始化后不能被改变对象的值,
final
和const
都是被作为常量关键字被使用的,而被它们修饰的变量,不能再修改其值。
扩展
??=
操作符考虑以下例子:
b ??= value; 复制代码
如果 b 为 null,就会把 value 赋值给 b。
如果 b 不为 null,则仍然保持原值。