在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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。 as 是类型转换,其相当于 :先检测 其是不是,然后再调用的一种简写。 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方法是不带参数列表的(不带参数括号!) |
请发表评论