在 Dart 中,万物皆对象,包括函数。git
全部的对象都继承自 Object 类。github
而且,全部对象的默认值都是 null。api
void main() {
var test_var;
print("value = $test_var");
}
>>>
value = null
复制代码
使用 var
关键字数组
var name = 'Bob';
复制代码
使用 var
能够声明一个不定类型的变量,但当该变量被第一次赋值时,该变量类型就被肯定。bash
今后,你不能再改变该变量的类型,任何错误的尝试,你都会获得编译器的报错。函数
eg:post
name = 1;
>>>
A value of type 'int' can't be assigned to a variable of type 'String'. 复制代码
使用 dynamic
或 Object
ui
这两个家伙具备一样的效果!spa
它们均可以达到声明一个可变类型的变量的效果,即你能够随时使用该变量来指向任何一种类型的对象。
固然,编译器是不会告诉你你犯了任何的错误,它只会让你的代码被顺利的编译 😄
确切来讲,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,则仍然保持原值。