详情请看 Dart 编程语言概览
一、目录
- 变量
- 内建类型(num、String、bool、List、Map、Set、Rune、Symbol、dynamic)
- 函数Function
- 闭包(定义在函数里面的函数就是闭包,闭包也是一个对象。它可以访问外部函数的局部变量。)
- 运算符
- 类(与其他语言一样,Dart 为类概念提供了内置支持。)
- if语句
- 循环操作
- 泛型
二、关键点
- 用
var、dynamic或者具体的类型来声明一个变量,它们的区别是什么? -
runtimeType用于获取变量当前的类型. - 用
final或const来声明一个常量. -
final和const有什么区别呢? -
const放在赋值语句的右边,可以共享对象,提高性能。
一、变量(用 var 、dynamic 或者具体的类型来声明一个变量)
- 变量仅存储对象的引用默认值。
- 未初始化的变量的值都是 null。
Dart 是类型安全的语言,所有类型都是对象类型,都继承自顶层类型 Object,因此一切变量的值都是类的实例,即对象;甚至数字、布尔值、函数和 null 也都是继承自 Object 的对象。
1、 使用var 声明变量(类型推导)。
当使用 var 定义变量时,表示类型是交由编译器推断决定的。
- 声明变量的时候如果没有赋值,那么值为null,并且之后可以赋不同的类型值。
- 声明变量的时候如果已经赋值,那么变量的类型就确定了。
如:
var a;方式一
var a = 100;方式二
-
runtimeType用于获取变量当前的类型
var name = 'coderwhy';
name = 'kobe';
print(name.runtimeType); // String
✅
void main() {
var a; // 声明变量的时候如果没有赋值,那么值为null,并且之后可以赋不同的类型值。
a = "hello word";
print(a);
a = 10; // 可以赋不同的类型值
print(a + 10);
}
❌
void main() {
var a = "hello word"; // 声明变量的时候如果已经赋值,那么变量的类型就确定了。
print(a);
a = 10; // 变量a的类型是String,不能将num类型的值赋给它
print(a + 10);
}
: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
lib/main.dart:7
a = 10;
^
2、 使用dynamic 声明变量。
声明变量的时候不管有没有赋值,之后都可以赋不同的类型值。因为会带来潜在的危险,在开发中, 通常情况下不使用dynamic,。
- 声明变量的时候不管有没有赋值,之后都可以赋不同的类型值。
如:
dynamic a;方式一
dynamic a = 100;方式二
✅
void main() {
dynamic a;
a = "hello word";
print(a);
a = 10;
print(a + 10);
}
✅
void main() {
dynamic a = "hello word";
print(a);
a = 10;
print(a + 10);
}
3、使用明确的类型声明变量
当然你也可以用具体类型去定义变量,更清楚地跟 编译器 表达你的意图,这样编辑器和编译器就能使用这些具体类型向你提供代码补全 或 编译警告的提示了。
如:
num a;方式一
num a = 100;方式二
二、常量(用final 或 const来声明一个常量)
如果你想定义不可变的变量即常量,则需要在定义变量前使用
final或const关键字替代var或具体的类型:
const表示必须用常量值或常量表达式初始化,且不能被再次赋值;适用于定义编译常量(字面量固定值)的场景;final表示可以在声明时或者运行时赋值,只能被赋值一次。适用于定义运行时常量的场景。但是如果声明时就赋值的话,编译器就会提示使用const。如:
const num a = 100;方式一,const表示必须用常量值或常量表达式初始化,且不能被再次赋值
const a = 100;方式二,const表示必须用常量值或常量表达式初始化,且不能被再次赋值final num d;
方式一,final表示可以在声明时或者运行时赋值,只能被赋值一次
final d;方式二,final表示可以在声明时或者运行时赋值,只能被赋值一次
d = 100;
:只能赋值一次
❌
void main() {
final c = "hello world";
c = "hello";
print(c);
}
: Error: Can't assign to the final variable 'c'.
lib/main.dart:7
c = "hello";
^
- final 和 const 有什么区别呢?
const在赋值时, 必须用常量值或常量表达式初始化,且不能被再次赋值;
final在赋值时, 可以动态获取, 比如赋值一个函数。
例子:
String getName() {
return 'coderwhy';
}
main(List<String> args) {
const name = getName(); // 错误的做法, 因为要执行函数才能获取到值
final name = getName(); // 正确的做法
}
- const放在赋值语句的右边,可以共享对象,提高性能。
这里可以暂时先做了解,后面讲解类的常量构造函数时,我会再次提到这个概念。
例子:
class Person {
const Person();
}
main(List<String> args) {
final a = const Person();
final b = const Person();
print(identical(a, b)); // true
final m = Person();
final n = Person();
print(identical(m, n)); // false
}







网友评论