dart语言一些注意点

 

1.

const是编译时就要确定值,所以不能这样写:

const datetime tim=datetime(); //因为datetime()的值只有运行时才能确定。

 

Final是第一次运行时需要确定值,所以可以这样写

Final datetime tim=datetime();//因为datetime()的值运行时才会确定,final关键字支持这样的用法

 

Const和final的相同点是二者的值都无法再次更改,区别在于初始化时间。const是编译时就要确定值,而final可以在第一次运行时确定值。另外,使用这两个关键字修饰变量都可以省略变量类型,如:

Final a=DateTime.now();

Const b=5;

 

2.

类大括号外面没有分号,如:

Class p{

Pass….

}

 

3.

只有一个语句的函数可以用胖箭头简写法,如

int f(var x){

return x*x;

}

再如:

void f(var t)=>print(t);

 

 

4.

typedef Fly = void Function(int value);//Fly是定义了一个方法,该方法只有一个int形参,Fly不是特定的函数,而是一个类型,可以用来定义变量。Fly类型的变量都是特定的具体函数。

void main(){

  Bird bird = Bird((int a){print(a);});//如果实参函数的类型不是该类型的话 编译不通过

  bird.fly(3);//bird是Bird类型的变量,Bird类中有一个Fly类型的变量,而Fly类型就是一个方法类型,所以fly成员变量就是一个特定的方法(函数),所以可以这样调用:bird.fly(3)

 Bird类定义在下面:

class Bird{

  Fly fly;

  Bird(this.fly);

}

 

5.

函数位置参数使用方括号[]括起来: int f(int x, int y,[int z]){} //z是可选的形参

函数命名参数用大括号{}括起来:int f({String name,String Sex}){},可以这样调用:

f(name:’wangziyou’,Sex:’Male’);

但二者不能同时使用

 

6.

断言assert,assert内部包含一个返回bool的表达式,如果返回false,那么assert就会抛出error暂停调试。正常使用方式是:对于不确定是否会报错的语句加上assert,如果正常运行不会抛出异常就代表这个语句没有问题。

 

7.

Dart中的String可以用单引号或者双引号扩起来,两种都行。

 

8.

  var p=['1','2','3','4']; //p是list<int>类型的

  var x=p.join('*'); //把p里的各个字符用*拼起来—-》;’1*2*3*4

  print(x.split('*')); //把x用*作为分割符,分割为不同的字符串,保存在list里

  如果字符串每个字符都分开,比如’abcd’—>’a’ ‘b’ ‘c’ ‘d’

写法是:p.split(‘’)即可,注意括号里是不带空格的,两个单引号是连着的。

之后再拼起来也是.join(‘’),括号里面也是不带空格的。

 

9.

dart的future对象用于异步调用,它的成员函数貌似返回的也都是future对象(这一点待确定)

 

10.

Dart中a/b结果为double类型的,如果想得到整数结果需要:a~/b

 

11.

is 、as 属于Type test operators。

is 判断是否是某个类型,返回true或者false。
如果a 是b的实现类,那么a is b 就返回true。

as 是类型转换,其相当于 :先检测 其是不是,然后再调用的一种简写。
但是还不是完全一致,当不是的时候,as 会抛出exception。

if (emp is Person) {

  // Type check

  emp.firstName = 'Bob';

}

可以简写为:

(emp as persion).firstName='Bob';

如果emp 不是persion,name就会抛出exception。

 

12.

??=也是赋值符,但只有在被赋值的变量为空时。如果不为空,则不做任何事情。

// 赋值给a

a = value;

// 如果b为空,则将值分配给b;否则,b保持不变

b ??= value;

 

??是条件运算符:

expr1 ?? expr2

如果expr1为非空,则返回其值;否则,计算并返回expr2的值。

 

13.

..是极联符(不算运算符,只是dart语法的一部分),它表示对前一句的对象进行一系列调用,只要是对象就行,不需要是某个函数的返回结果。栗子:

void main(){

  List p=[];

  p

  ..length

  ..clear()

  ..sort();

}

这段代码相当于p.length; p,clear(); p.sort();

注意极联的缩进

 注意点:极联返回的是当前调用的对象本身,和函数返回值无关!!!和函数返回值无关!!!和函数返回值无关!!!

14.

Dart支持函数的嵌套定义

 

15.

Dart中所有函数都有返回值。

没有显示返回语句的函数最后一行默认为执行 return null;。

foo() {}

assert(foo() == null); 

 

16.

 

Dart中捕获异常通过try on/catch来实现,on可以指定具体的异常类型,catch则可以捕获异常对象:catch(e),然后可以输出e的信息。

try {

  breedMoreLlamas();

} on OutOfLlamasException {

  // 指定异常

  buyMoreLlamas();

} on Exception catch (e) {

  // 其它类型的异常

  print('Unknown exception: $e');

} catch (e) {

  // // 不指定类型,处理其它全部

  print('Something really unknown: $e');

} 

 

17.

 

两个使用相同构造函数相同参数值构造的编译时常量是同一个对象:

 

var a = const ImmutablePoint(1, 1);

var b = const ImmutablePoint(1, 1);

 

assert(identical(a, b)); // 它们是同一个实例 (They are the same instance!)

 

18.

子类中可以通过super.xxxx()来调用父类的方法

 

19.

继承这样写的:

class Person {

    int age;

    string name;

    Person(int age, String name){

        this.age = age;

        this.name = name;

    }

    void sayhi(){

        print('my name is' this.name)

    }

}

 

class Worker extend Person{

    int salary;

    Worker(int age, string name, int salary) : super(age, name){  //super表示要继承父类的属性

        this.salary = salary;

    }

    @override  //告诉编译器和程序员他是一个重写覆盖父类的方法

    void sayhi(){     super.sayhi()    //表示调用父类的sayhi方法

        print('my salary is'+ this.salary)

    }

}

 

20.

dart中系统默认类型的数据(比如int/num这种基本的数据类型),两个相同值的不同变量是=的

但如果是自己定义的类,但是没有重载=运算符,甚至是官方的map/set/list进行=比较,都会返回false:

因为dart中的所有类型都是object的子类,所以如果没有单独定义=运算符,那么对两个变量进行=运算,都使用的是object的=运算符,而object的=运算符是用于检测参数与接收者是否相同,所以就会出现下面这种奇怪的情况,c++里是不会有这种情况的:

需要operator= (another) {return xxxxx;}来对=运算符进行重载,这样就可以通过=判断是否相等了。

然后如果还有需要判断是否相同的需求,可以使用identical(a,b)的方法,该方法定义在dart:core库中。

21.

set方法写法:set(another)=> xx=another.xx;

get方法写法:get=>xxxx;    //注意get方法是不带参数列   表的(不带参数括号!)

22.

dart的var只是语法糖,实际用var命名的变量是dynamic类型,然后会在编译时被推导为各自的类型。(注意var绝不是数据类型,只是语法糖,语法糖,语法糖,说三遍!)

23.

dart中的extends with是混入的意思。dart中使用其他类方法有三种方式:继承/混入和接口,对应的关键字分别是extends/with/implements。

三者可以同时存在,但有先后次序,继承>混入>接口。

dart中的继承只能是单继承,但混入和接口可以有多个,用逗号隔          开即可。注意如果 

24.

dart中父类和子类可以互相赋值。

25.

dart中字符串前面+r就代表无转义,比如r'\n'就会输出\n

26.

print格式化输出,用$和变量名一起作为占位符:

main() {
  String s1='hello';
  String s2='bytedance';
  print('$s1 i am wangziyou  i love $s2');
}

 

posted @ 2020-07-22 09:27  NeoZy  阅读(389)  评论(0编辑  收藏  举报