美文网首页
Dart学习1-语法

Dart学习1-语法

作者: 壹元伍角叁分 | 来源:发表于2022-03-16 22:29 被阅读0次

Dart特点:

1、基于JIT的快速开发周期:
flutter在开发阶段采用了JIT模式,避免了每次改动都要进行编译,节省开发时间(运行的时候再去编译成机器码)

2、基于AOT的发布包:
flutter在发布时可以通过AOT生成高效的ARM代码以保证应用性能。
(提前将我们的代码编译成机器码)

3、单线程
不需要锁,不存在数据竞争和变量状态同步,也没有线程上下文切换的性能顺灏和锁导致的卡顿

4、垃圾回收
多生代(新生代:复制-清除算法、老生代:标记-清除算法。第一次创建的时候就是新生代,每隔一段时间检查一遍变量,有用的就保留,没用的清除,这些存活下来的就会标记一下,到了一定数量就会进入老生代,老生代的对象很少被清理)无锁垃圾回收器,专门为UI框架中常见的大量widgets对象创建和销毁优化

1、变量

1.1 var与dynamic

void main() {
  // 方法可以不写在类中,独立存在
  int a = 0; // 声明变量,可以直接用int,与java类型

  var b = "哈哈";
  // b = 10; // 报错,声明变量赋值的那一刻,就决定了它的类型。b是string类型

  var c; // 没有给变量c赋值,那c的值就是null,类型是object。下面就可以任意赋值
  c = "嘿嘿";
  c = 10;

  // dynamic关键字,意思是动态的。不是在编译的时候来确定变量的实际类型,而是在运行的时候动态的确定类型
  // 效率没有静态的高。
  // 在不确定类型时传入,不经常使用
  dynamic d = "呵呵";
  d = 20;

  // 以下三个的区别。是编译和运行的时候,底层实现上存在区别
  Object i = 1; // 在编译的时候是object,任意类型。它的类型由它的值确定
  var j = 1; // 在编译期确定了j的类型是int
  dynamic z = 1; // 在运行时才确定z的类型,它的类型也是由它的值确定
}

2.2 final与const

void main2() {
  final i = 1; // final是运行时常量
  // i = 2; // 报错,final修饰的变量不能再赋值。和java中用法一样

  const j = 1; // const是编译器常量,在编译期就已经确定了值,运行效率比final高
  // j =2; // 报错,const修饰的变量也不能再赋值。

  // const z = i; // 报错,i是运行时才确定值,不能赋值给编译期就需要确定的变量
  const z = j; // 这个是可以的,都是编译器就能确定的值
  const z2 = j + 1;

  final k = z2; // 这个也可以的。可以将编译时就确定的值赋值给运行时才确定的变量
}

2、七大内置类型

数值类型(num)、字符串类型(String)、布尔类型(bool)、数组类型(List)、映射类型(Map)、Unicode(Runes)、标识符(Symbols)

2.1 数值类型(num)

void main() {
  // java中的int占4个字节,dart中的int 是动态确定字节大小的
  // 在编码的时候,可以将int当成java的short、int、long来使用,
  // 如果我们写的dart代码超过了4个字节,那么dart会将其编译成类似java中的long类型
  // 否则编译成java中的short或者int
  int i = 1; // 占1个字符
  int i1 = 2; // 占2个字符
  int i2 = 3; // 占2个字符
  int i3 = 10; // 占4个字符
}

2.2 字符串类型(String)

void main() {
  String str = "haha"; //声明和java中的string一样
  String str2 = "${str}hehe"; // 字符串的拼接和kotlin中的类似

  String str3 = 'heihei'; // dart中既可以使用单引号,也可以使用双引号,没有区别
  // 其好处是,可以混合使用。比如说在java中如果想要打印带有双引号的字符串,就需要使用转义
  String str4 = "\"test\""; // java中写法。dart也可以这样写,但还有下面两种写法。
  String str5 = "'test'"; // dart中就可以混合写,写法2
  String str6 = '"test2"'; // dart中写法3

  // 如果我们想在dart中打印带转义字符的字符串,比如打印 /n ,也需要使用转义
  String str7 = "\\n";
  // 也可以使用r前缀,r的意思就是raw,原始。舍弃字符串中所有的字表符、换行符、空格符等
  String str8 = r"\n";

  // 三个双引号用来声明多行字符串。与kotlin中类似
  String str9 = """
  aaaa
  bbbbbb
  cccccccc
  """;
}

2.3 布尔类型(bool)

void main() {
  bool b = false;
}

2.4 数组类型(List)

void main() {
  // List<String> list = new List(); // 可以省略new
  List<int> list1 = [1, 2, 3, 4]; // 可以直接用中括号进行赋值,初始列表
  // 像java数组一样通过下标取元素,和kotlin类似
  var item = list1[0];

  // 遍历数组方式1,(模板快捷键iter)
  for (var o in list1) {}

  // 遍历数组方式2,(模板快捷键itar)
  for (var i = 0; i < list1.length; ++i) {
    var o = list1[i];
  }

  // 在初始列表前添加关键字const
  // const前面学过,表示编译期就已经确定了的值,不可修改。这里表明这个集合对象是不可变的,不能再add元素了
  List<int> list2 = const [1, 2, 3, 4];
  // list2.add(5); // 运行时报错
  list2 = [1, 2]; // 不报错

  // 如果const修饰的是变量,也就是引用,那么变量就不能再重新引用其他对象了,也不能添加元素
  const List<int> list3 = [1, 2, 3, 4];
  // list3 = [1,2]; // 编译报错
  // list3.add(5); // 运行时报错
}

2.5 映射类型(Map)

void main() {
  // key和value用 : 分隔
  Map<int, int> map = {1: 2, 2: 3, 3: 4};
  var value = map[1]; // 中括号里的是key,得到的值是value
  map[1] = 1; // 修改value

  // 用const声明和list是一样的。const修饰对象,不可添加/修改元素
  var map1 = const {1: 2, 2: 3, 3: 4};
  // map1[3] = 100;// 添加元素,运行报错

  // const Map<int, int> map2 = {1: 2, 2: 3, 3: 4};
  // map2[3] = 100;// 添加元素,运行报错

  const Map<int, int> map2 = {1: 2, 2: 3, 3: 4};
  // map2[3] = 100;// 添加元素,运行报错
  // map2 = {1: 2, 2: 3};// 运行报错

  // 遍历:迭代器的遍历
  var keys = map2.keys;
  for (var value1 in keys) {}
}

2.6 Unicode(Runes)/ 标识符(Symbols)

Unicode Runes:特殊字符表示类(Unicode32,字符的编码标准)。不常用

// Symbols 标识符。不常用
void main() {
  var a = #afda;
  print(a.runtimeType);// 打印的结果就是Symbol
  // 可以用于switch语句
}

3、操作符

3.1 类型转换:as

void main() {
  var j = 1;
  var i = j as int; // 类型转换,类似kotlin,java中的强转
  print('i=$i');

3.2 类型判断 :is 、 is!

void main() {
  Object i1 = 1;
  var isInt = i1 is int; // 类型判断,类似kotlin,java中的instantof
  var isBool = i1 is! bool; // 判断对象不是某个类型

3.3 赋值操作符:??=

void main() {
  var a;
  if (a == null) {
    a = "赋值了";
  }
  a ??= "我的值为null"; //安全赋值。如果k的值为null,则输出等号后面的值。相当于kotlin中的?=
}

3.4 条件表达式:

void main() {
  // 三目表达式 ? :
  var c = true ? "t" : "f"; // 与java用法一样

  // ??
  var d;
  var d1 = 1;

  var e = d ?? 2; // e = 2
  var e1 = d1 ?? 2; // e1 = 1
}

3.5 级联操作符:..

void main() {
  // 使用两个..来实现链式调用
  Builder()
    ..aa()
    ..bbbb() // bbbb()的返回值会被忽略
    ..ccccccc();
}
class Builder {
  void aa() {}

  bool bbbb() {
    return true;
  }

  void ccccccc() {}
}

3.6 安全操作符:?.

void main() {
  // 类似kotlin中的
  var str = null;
  print(str?.length); // 如果str为null,不执行str.length()
}

相关文章

  • Dart学习1-语法

    Dart特点: 1、基于JIT的快速开发周期:flutter在开发阶段采用了JIT模式,避免了每次改动都要进行编译...

  • -bash: dart: command not found

    今天开始学习下dart语法,新建个helloWorld.dart文件,执行dart helloWorld.dart...

  • dart语法7-泛型

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法8-库

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法10-生成器

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法9-异步

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法11

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法2-内置类型

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法1

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法3-函数

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

网友评论

      本文标题:Dart学习1-语法

      本文链接:https://www.haomeiwen.com/subject/ziupdrtx.html