内置类型

Last updated: ... / Reads: 39 Edit

Dart 语言对以下内容有特殊支持:

  • 数字( int 、 double )
  • 字符串 ( String )
  • 布尔值 ( bool )
  • 记录 ( (value1, value2) )
  • 列表( List ,也称为数组)
  • 集合 ( Set )
  • 地图 ( Map )
  • 符文( Runes ;通常由 characters API 替换)
  • 符号 ( Symbol )
  • 值 null ( Null )

此支持包括使用文字创建对象的能力。例如, 'this is a string' 是字符串文字, true 是布尔文字。

因为 Dart 中的每个变量都引用一个对象(类的实例),所以您通常可以使用构造函数来初始化变量。一些内置类型有自己的构造函数。例如,您可以使用 Map() 构造函数来创建地图。

其他一些类型在 Dart 语言中也有特殊作用:

  • bject :除 Null 之外的所有 Dart 类的超类。
  • Enum :所有枚举的超类。
  • Future 和 Stream :用于异步支持。
  • Iterable :用于 for-in 循环和同步生成器函数。
  • Never :表示表达式永远无法成功完成计算。最常用于总是抛出异常的函数。
  • dynamic :表示您要禁用静态检查。通常您应该使用 Object 或 Object? 代替。
  • void :表示从未使用过某个值。通常用作返回类型。

Object 、 Object? 、 Null 和 Never 类在类层次结构中具有特殊角色。您可以在了解零安全性中了解这些角色。

数字

Dart 数字有两种类型:

int

整数值不大于 64 位,具体取决于平台。在本机平台上,值可以是从 -2 63 到 2 63 - 1。在 Web 上,整数值表示为 JavaScript 数字(64 位浮点值,没有小数部分),可以是从 -2 53 到 2 53 - 1。

double

64 位(双精度)浮点数,由 IEEE 754 标准。

intdouble 都是 num 的子类型。 num 类型包括基本运算符,例如 +-/*,您还可以在其中找到 abs()ceil()floor() ,除其他方法外。 (按位运算符,例如 >>,在 int 类中定义。)如果 num 及其子类型没有您要查找的内容,则 dart:math 库可能有。

整数是没有小数点的数字。以下是定义整数文字的一些示例:

var x = 1;
var hex = 0xDEADBEEF;

如果一个数字包含小数点,则它是双精度。以下是一些示例 定义双文本:

var y = 1.1;
var exponents = 1.42e5;

您也可以将变量声明为 num。如果这样做,则变量 可以同时具有整数值和双精度值。

num x = 1; // x can have both int and double values
x += 2.5;

必要时,整数文字会自动转换为双精度:

double z = 1; // Equivalent to double z = 1.0.

以下是将字符串转换为数字的方法,反之亦然:

// 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');

该类型指定传统的按位移位 (, , ), 补码 ()、AND()、OR () 和 XOR () 运算符, 这对于操作和屏蔽位字段中的标志很有用。 例如: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;

有关详细信息,请参阅 Dart 中的数字。

字符串

Dart 字符串(对象)包含一系列 UTF-16 代码单元。 您可以使用以下任一方法 用单引号或双引号创建字符串:String

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.";

可以使用表达式将表达式的值放在字符串中。如果表达式是标识符,则可以跳过 {}.为了获取与对象对应的字符串,Dart 调用 对象的方法。${}toString()

var s = 'string interpolation';

assert('Dart has $s, which is very handy.' ==
    'Dart has string interpolation, '
        'which is very handy.');
assert('That deserves all caps. '
        '${s.toUpperCase()} is very handy!' ==
    'That deserves all caps. '
        'STRING INTERPOLATION is very handy!');

注意:运算符测试两个对象是否相等。二 如果字符串包含相同的代码序列,则它们是等效的 单位。==

您可以使用相邻的字符串文字或运算符连接字符串:+

var s1 = 'String '
    'concatenation'
    " works even over line breaks.";
assert(s1 ==
    'String concatenation works even over '
        'line breaks.');

var s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');

若要创建多行字符串,请使用三引号 单引号或双引号:

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

您可以通过在“原始”字符串前面加上以下前缀来创建“原始”字符串:r

var s = r'In a raw string, not even \n gets special treatment.';

请参阅符文和字形簇,了解如何操作的详细信息 在字符串中表示 Unicode 字符。

文字字符串是编译时常量, 只要任何插值表达式是编译时常量 计算结果为 null 或数值、字符串值或布尔值。

// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];

const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';

有关使用字符串的详细信息,请查看字符串和正则表达式。

布尔值

为了表示布尔值,Dart 有一个名为 的类型。只有两个 对象具有 bool 类型:布尔文字和 , 它们都是编译时常量。booltruefalse

Dart 的类型安全意味着你不能使用像 或 这样的代码。 相反,显式检查值,如下所示:if (nonbooleanValue)assert (nonbooleanValue)

// 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);

符文和字形簇

在 Dart 中,符文公开字符串的 Unicode 码位。 您可以使用 characters 包来查看或操作用户感知的字符, 也称为 Unicode(扩展)字素簇。

Unicode 为每个字母、数字、 和世界上所有书写系统中使用的符号。 因为 Dart 字符串是 UTF-16 代码单元的序列, 在字符串中表达 Unicode 码位需要 特殊语法。 表示 Unicode 码位的常用方法是 ,其中 XXXX 是 4 位十六进制值。 例如,心形字符 (♥) 是 。 要指定多于或少于 4 个十六进制数字, 将值放在大括号中。 例如,笑的表情符号 (😆) 是 。\uXXXX\u2665\u{1f606}

如果需要读取或写入单个 Unicode 字符, 使用 String 上定义的 getter 通过字符包。 返回的 Characters 对象是字符串 字形簇的序列。 下面是使用字符 API 的示例:characters

import 'package:characters/characters.dart';

void main() {
  var hi = 'Hi 🇩🇰';
  print(hi);
  print('The end of the string: ${hi.substring(hi.length - 1)}');
  print('The last character: ${hi.characters.last}');
}

输出,具体取决于您的环境,如下所示:

 dart run bin/main.dart
Hi 🇩🇰
The end of the string: ???
The last character: 🇩🇰

有关使用 characters 包操作字符串的详细信息, 请参阅 characters 包的示例和 API 参考

符号

一个 Symbol 对象 表示在 Dart 程序中声明的运算符或标识符。你 可能永远不需要使用符号,但它们对于 API 来说非常宝贵 按名称引用标识符,因为缩小会更改标识符 名称,但不包括标识符符号。

若要获取标识符的符号,请使用符号文本,该文本后面跟标识符:#

#radix
#bar

符号文本是编译时常量。


Comments

Make a comment