Dart内置类型(共10类)
Dart官网文档:https://dart.dev/language/built-in-types
Dart内置类型即Dart SDK自带的类型,我们编程过程中可直接使用的类型,主要分为10类:
- 数值类型:包括
int
类、double
类等。 - 字符串类型:即
String
类。 - 布尔类型:即
bool
类。 - 记录类型:即
Record
类,Dart 3中开始支持(最新版本的Java 21也支持)。 - 列表类型:即
List
类,同时也是数组。 - Set类型:即
Set
类。 - 映射类型:即
Map
类。 - 字符类型:与字符相关处理。
- 符合类型:即Symbol类。
- 特殊值:
null
空值。
Dart中类型的其他一些规则:
Object
类是Dart中除Null
之外的所有类的基类。扩展问题:Dart中顶层类是什么呢?Enum
类是Dart中所有枚举类的基类。扩展问题:Enum类是Object的子类吗?答案:是。dynamic
类型Dart的静态检测会失效,容易引发空安全等其他运行时错误,建议使用Object
或者Object?
代替。Future
和Stream
支持异步编程。Never
一般用于总是抛出异常的函数,表明表达式用于无法成功执行。void
表明值不会被再次使用,一般用户函数返回值。
数字类型(int和double)
Dart中数字类型类结构如下:
int
和double
都是num
类的子类。int
为不超过64位的整数,double
为64位双精度浮点数。
num
类型支持操作:加+
,减-
,乘*
,除/
,abs()
绝对值,ceil()
向上取整,floor()
向下取整操作。特别注意:位操作,如>>
右移或者<<
左移等位操作,仅int
类型支持。
代码样例:如下代码,数字类型定义。
// int类型
var x = 1;
var hex = 0xDEADBEEF;
// double类型
var y = 1.1;
var exponents = 1.42e5;
double z = 1; // 等同于:double z = 1.0;
// num类型:既可以是整数,又可以是浮点数
num x = 1;
x += 2.5;
代码样例:如下代码,数字类型和字符串相互转换。
// String -> int
var one = int.parse('1');
assert(one == 1);
// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
代码样例:如下代码,int
类型位操作。
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 | 4) == 7); // 0011 | 0100 == 0111
assert((3 & 4) == 0); // 0011 & 0100 == 0000
代码样例:如下代码,字面量数字属于编译时常量,因此字面量数字表达式也可以作为常量。
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
字符串类型(String)
Dart中字符串是一个UTF-16的序列码,我们可以通过'
单引号或者"
双引号定义一个字符串、通过${}
进行字符串插值、通过相邻字符串连接、使用+
符号进行连接,通过3个单引号'''
或者3个双引号"""
定义多行字符串,还可以通过增加前缀r
定义原始字符串。
代码样例:如下代码,字符串的各种定义方式。
// 引号:单引号或双引号
var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";
// 插值
final name = 'Tom';
var s5 = 'My name is $name.';
assert(s5 == 'My name is Tome.');
// 相邻字符串
var s6 = 'String '
'concatenation'
" works even over line breaks.";
assert(s6 ==
'String concatenation works even over '
'line breaks.');
var s7 = 'The + operator ' + 'works, as well.';
assert(s7 == 'The + operator works, as well.');
// 多行字符串:3个单引号或3个双引号
var s8 = '''
My name is Tom.
I am a boy.
''';
var s9 = """
My name is Tom.
I am a boy.
""";
// 原始字符串
var s10 = r'My name is Tome.\nI am a boy.';
特别注意:==
双等于号操作符在Dart中用于检测2个对象是否相等,如果是字符串,则是校验它们的序列码是否相同(这与Java有很多的区别)。
代码样例:如下代码,字面量字符串是编译时常量,如果字符串插值表达式中的变量是常量,那么插值字符串也是常量。
// 字面量字符串
const aConstString = 'a constant string';
// 插值字符串常量
const aConstNum = 0;
const aConstBool = true;
const validConstString = '$aConstNum $aConstBool $aConstString';
布尔类型(bool)
Dart中只有2个对象是bool
类型:true
和false
,且他们都是常量。
代码样例:如下代码,在表达式中的布尔类型。
// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);
// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);
// Check for null.
var unicorn = null;
assert(unicorn == null);
// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
字符和符号(characters)
Dart中字符代表字符串中一个Unicode编码单元。Unicode为世界上的每个字母、数字和符合定义了一个唯一数字值。
由于Dart的字符串是UTF-16编码,因此Dart中表示Unicode有其对应的语法格式,常用的方式为\uXXXX
代表一个字符,其中XXXX
是4位16进制的值。
举例说明:心形字符♥的值为\u2665
,如果少于或者超过4位16禁止值,则用{}
包裹起来,如笑脸字符