Dart基础学习

目录

概述

变量

默认值

Final 和 const修饰符

内建类型

Numbers(数值)

Strings(字符串)

Booleans(布尔值)

Lists(列表)

Maps

Runes(字符)

Symbols(符号)



概述

当您了解Dart语言时,请记住以下事实和概念

  • 在Dart中,一切都是对象,一切对象都是class的实例,哪怕是数字类型、函数和null都是对象,所有的对象都是继承自Object
  • 虽然Dart是强类型语言,但变量类型是可选的,因为Dart可以自动推断变量类型
  • Dart支持泛型,List<int>表示一个整型的数据列表,List<dynamic>则是一个任意类型的对象列表,其中可以装任意对象
  • Dart支持顶级函数(如main() 函数),也支持类方法(静态方法)或对象方法,同时也支持在函数内部创建函数(嵌套函数和本地函数)
  • Dart支持顶级变量,也支持类变量(静态变量)或对象变量(实例变量),实例变量有时称为字段或属性
  • 跟Java不同的是,Dart没有public protected private等关键字,如果某个变量以下划线(_)开头,代表这个变量在库中是私有的
  • Dart中变量可以以字母或下划线(_)开头,后面跟着字符或数字的任意组合
  • Dart既有表达式(具有运行时值),也有语句(不具有运行时值)。例如,条件表达式condition ? expr1 : expr2的值为expr1或expr2。将其与if-else语句进行比较,后者没有任何值。语句通常包含一个或多个表达式,但表达式不能直接包含语句。
  • Dart工具可以报告两种问题:警告和错误。警告只是表明代码可能无法正常工作,但它们不会阻止程序执行。错误可以是编译时的,也可以是运行时的。编译时错误会阻止代码执行; 运行时错误导致代码执行时引发异常。

变量

以下是一个创建变量并初始化它的例子:

var name = 'Bob';

变量存储引用。名为name的变量包含对字符串对象的引用,值为“Bob”。

name变量的类型被推断为String,但是您可以通过指定它来更改该类型。如果对象不限于单一类型,则可以指定对象 (Object)或动态(dynamic)类型。

dynamic name = 'Bob';

另一种方法是声明要推断的类型:

String name = 'Bob';

默认值

未初始化的变量的初始值为null。甚至具有数字类型的变量最初也是null,因为数字就像dart中的其他类型一样是对象。

int lineCount;
assert(lineCount == null);

注意:断言assert()调用在release模式中会被忽略。在debug模式下,assert(condition) 的condition条件不为真时抛出一个异常。

Final 和 const修饰符

如果您从未打算更改一个变量,请使用final或const修饰他,而不是使用var或其他变量类型。

final变量只能设置一次;const变量是一个编译时常数。

final name = 'Bob'; // 没有类型注释
final String nickname = 'Bobby';

对于想要在编译时确定并且不再变的变量,使用const。如果const变量位于类级别,则将其标记为static const。

在声明该变量时,将该值设置为编译时常量,例如数字或字符串字面量、const变量或常量数字算术运算的结果:

const bar = 1000000; 
const double atm = 1.01325 * bar; 

const关键字不只是声明常量变量。还可以使用它来创建常量值,以及声明创建常量值的构造函数。任何变量都可以赋一个常量值。

var foo = const [];
final bar = const [];
const baz = []; // 可以省略声明const的初始化表达式,相当于 “const[]” 

可以更改一个非final的非const变量的值,即使它曾经有一个const值:

foo = [1, 2, 3]; 

不能改变const变量的值:

baz = [42]; // 错误:常量变量不能被赋值

final和const的区别

区别一:final 要求变量只能初始化一次,并不要求赋的值一定是编译时常量,可以是常量也可以不是。而 const 要求在声明时初始化,并且赋值必需为编译时常量。

区别二:final 是惰性初始化,即在运行时第一次使用前才初始化。而 const 是在编译时就确定值了。

内建类型

Dart有如下几种内建的数据类型:

  • numbers
  • strings
  • booleans
  • lists(或者是arrays)
  • maps
  • runes(UTF-32字符集的字符)
  • symbols

Numbers(数值)

Dart的数字有两种形式:int ( 整数值 ) 和  double (双精度浮点数)

int和double都是num的子类型。num类型包括基本的操作符,如+、-、/和*,您还可以在其中找到abs()、ceil()和floor()等方法。

int是不带小数点的数字。下面是一些定义int的方式:

int x = 1;
int hex = 0xDEADBEEF;

如果一个数带小数点,则其为 double, 下面是定义 double 的一些方式:

double y = 1.1;
double exponents = 1.42e5;

下面是字符串和数字之间转换的方式:

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

数字字面量为编译时常量。 许多算术表达式只要其操作数是常量,则表达式结果也是编译时常量。

const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;

Strings(字符串)

Dart字符串是UTF-16编码单元的序列。您可以使用单引号或双引号创建一个字符串:

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

另一种创建多行字符串的方法:使用带有单引号或双引号的三重引号:

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

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

可以使用${expression}将表达式的值放入字符串中。如果表达式是一个标识符,可以省略 {}。 如果表达式的结果为一个对象,则 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!');       

注意: == 操作符判断两个对象的内容是否一样。 如果两个字符串包含一样的字符编码序列, 则他们是相等的。

通过提供一个 r 前缀可以创建一个 “原始”字符串:

var s = r'In a raw string, not even \n gets special treatment.'; // \n 不会被换行

字符串字面量是编译时常量, 带有字符串插值的字符串定义,若干插值表达式引用的为编译时常量则其结果也是编译时常量。

// 常量字符串
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant 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';

Booleans(布尔值)

为了表示布尔值,Dart有一个名为bool的类型。 只有两个对象是布尔类型的:true 和 false 所创建的对象, 这两个对象也都是编译时常量。

Lists(列表)

在Dart中,数组是List对象,所以大多数人把它们称为List。

下面是一个 Dart list 的示例:

var list = [1, 2, 3];

注意:编译器推断该列表具有List<int>类型。如果试图向此列表添加非整型对象,则编译器或运行时将引发错误。

要创建一个编译时常量列表,请在列表字面量之前添加const:

var constantList = const [1, 2, 3];
// constantList[1] = 1; // 常量无法改变其值

Maps

通常map是一个关联键和值的对象。键和值都可以是任何类型的对象。每个键只出现一次,但是可以多次使用相同的值。Dart对map的支持是通过map字面量和Map类型来提供的。

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

注意:编译器推断gifts的类型为Map<String, String>,nobleGases的类型为Map<int, String>。如果您试图向map添加错误类型的值,则编译器或运行时将引发错误。

同样可以使用Map构造函数创建对象:

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

注意:你可能觉得我们应该使用new Map()而不是使用Map()来创建一个对象。但是,在Dart2中new关键字是可选的。

同样使用 const 可以创建一个 编译时常量的 map:

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

// constantMap[2] = 'Helium'; // 常量无法改变其值

Runes(字符)

在Dart中,runes是字符串的UTF-32编码字符集。

Unicode 为每一个字符、标点符号、表情符号等都定义了 一个唯一的数值。 由于 Dart 字符串是 UTF-16 code units 字符序列,所以在字符串中表达 32-bit Unicode 值就需要新的语法了。

通常使用 \uXXXX 的方式来表示 Unicode code point, 这里的 XXXX 是4个 16 进制的数。 例如,心形符号 (♥) 是 \u2665。 对于非 4 个数值的情况, 把编码值放到大括号中即可。 例如,笑脸 emoji (?) 是 \u{1f600}

String类有几个属性可以用来获取runes信息。codeUnitAt和codeUnit属性返回16位代码单元。使用字符属性获取字符串的字符。

下面的示例说明了字符、16位代码单元和32位代码点之间的关系。

main() {
  var clapping = '\u{1f600}';
  print(clapping);
  print(clapping.codeUnits);
  print(clapping.runes.toList());

  Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
  print(new String.fromCharCodes(input));
}

//运行效果如下
?
[55357, 56832]
[128512]
♥  ?  ?  ?  ?  ?

Process finished with exit code 0

注意: 使用 list 操作 runes 的时候请小心。 根据所操作的语种、字符集等, 这种操作方式可能导致你的字符串出问题。

Symbols(符号)

一个 Symbol 符号对象表示在Dart 程序中声明的操作符或者标识符。 你也许从来不会用到 Symbol,但是该功能对于通过名称来引用标识符的情况是非常重要的,特别是混淆后的代码,标识符的名字被混淆了,但是 Symbol 的名称不会改变。

使用 Symbol 字面量来获取标识符的 symbol 对象,也就是在标识符前面添加一个 # 符号:

#radix
#bar

Symbol 字面量定义是编译时常量。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值