美文网首页
Dart基础_1

Dart基础_1

作者: 拙峰朽木 | 来源:发表于2019-06-21 19:15 被阅读0次

    主要讲一些注意点,跟主流语言差不多的就不讲了。目测0基础学习Dart的人应该很少甚至没有吧。主要是移动端开发和前端开发学习。欢迎评论欢迎来撕。

    变量

    先展示下几种变量的声明方式,然后再说下区别

    void main() {
      //var 声明时 不初始化
      var a;
      a = false;
      a = 123;
      a = 'test';
      print(a);
      
      //var 声明时 初始化
      var b = false;
    //  b=123;   编译器报错
    //  b='test';
      print(b);
    
      //dynamic
      dynamic c = false;
      c = 123;
      c = 'test';
      print(c);
    
      //Object
      Object d = false;
      d = 123;
      d = 'test';
    
      //明确具体类型
      String e = 'test';
      print(e);
    
    }
    

    var

    首先要明确的是:Var只是个关键字,编译器会根据赋值反推其声明的类型

    声明时不进行初始化
     //声明时 不初始化
      var a;
      a = false;
      a = 123;
      a = 'test';
      print(a);
    

    这个情况,后面变量可以随意更改指向的对象类型。

    声明时 进行初始
    var.png

    声明直接初始化,则变量的能指向的引用类型被固定,之后这个变量就不能指向其他类型对象。

    dynamic

    先看下与var的区别,它即使是在声明时进行了初始化,后面还能指向其他类型的对象。如下

      dynamic c = false;
      c = 123;
      c = 'test';
      print(c);
    

    这是为什么呢?

    首先dynamic不是关键字,它表示一种未知类型,所以它可以表示所有类型
    其次 dynamic声明的变量类型是在运行时才确定,所以编译器在编译时不会检查
    个人感觉类似于java中泛型里常用的T,同时它在Dart的常用场景也是泛型。

    Object

    看下面源码的注释,Dart所有对象的基础类。类似java中的Object

    part of dart.core;
    
    /**
     * The base class for all Dart objects.
     *
     * Because Object is the root of the Dart class hierarchy,
     * every other Dart class is a subclass of Object.
    .....
     */
    @pragma("vm:entry-point")
    class Object {
        
        }
    

    那他与dynamic的区别是什么呢?

    其实主要是一个是编译时确定声明的变量类型,一个是在运行时确定变量类型。

    下面演示个例子,一看就了解了:

    class Person {
      var age;
    }
    
    class Girl extends Person {
      void birth() {
        print('生小孩');
      }
    }
    
    void main() {
      canBirth(Girl());
    }
    
    void canBirth(dynamic person) {
      person.birth();
    }
    

    其中 最后一个scanBirth()方法的参数有好几种写法

    q.png

    因为birth()方法不是Person和Object对象的,所以我们调用编译器会报错。此时针对传入的参数类型不确定,想要这个方法通用,并且不报错。那么就可以用dynamic了,因为他是运行时才确定变量类型的,所以编译器在编译时并不会去检查它的问题。

    使用建议

    个人建议:

    • 在知道变量类型的情况下,尽量显示的声明变量类型。类似:String a ='hello'; 这样能省去类型反推
    • 使用Var的时候尽量在声明时就初始化,这样声明后就确定了变量类型
    • 尽量少用dynamic,因为使用它至少编译器就不能帮你检查出一些编译时的错误

    常量

    常量就是声明初始化后就不能改变,dart中主要通过final和const来修饰常量。
    还有就是常量声明的时候就必须初始化。

    ![字符串.png](https://img.haomeiwen.com/i622557/538b2c6975c54178.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    final

    修饰的常量初始化后就不能更改了。它修饰的常量在运行时才生成。

    const

    const跟final的区别是 它修饰的常量是在编译时就生成了。

    所以正常情况下 const的不能在对象中使用,因为对象实例都是在运行时才创建。如果想在对象中使用const,则需要加static修饰,作为静态常量使用,这样就能保证其在编译时就生成。

    区别

    • 常量生成时机不同,const是编译时,final是运行时
    • const定义的常量会传递到期子对象,其子元素也是不可修改的
    • const不会重复定义相同对象
      先代码验证下上面说的第二条
    void main() {
      final a =[1,2,3];
      print(a);
      a[1]=4;
      print(a);
    }
    

    看下输出结果:


    final_test.png

    下面我们看下const 修饰List会怎样

    void main() {                           
      const a =[1,2,3];                     
      print(a);                             
      a[1]=4;                               
      print(a);                             
    }                                       
    

    看下输出:


    const_test.png

    使用final修饰的List里面的参数是可以更改的,const修饰的不能更改

    下面再使用const和final分别定义相同的对象,看看他们有没有重复生成相同对象

    void main() {                               
      const a =[1,2,3];                         
      const b =[1,2,3];                         
      print(a.hashCode);                        
      print(b.hashCode);                        
                                                
      final c =[1,2,3];                         
      final d =[1,2,3];                         
      print(c.hashCode);                        
      print(d.hashCode);                        
    }                                          
                                                
    

    看下输出结果


    image.png

    可以看到const声明的对象内存中不会重复创建,而final修饰的会

    基本数据类型

    先讲讲基本的 numbers ,Strings,;booleans看看于其他语言的却别

    Numbers

    在Dart中我们会发现long,float,short 这些数据类型是没有的。Dart中只有两种数据类型int和double。

    Strings

    Dart的字符串类型和Kotlin语言中的基本相同,比如说模板形式

    void main() {
      String s ='111';
      print('this is a test : $s}');
    }
    

    可以在字符串中使用表达式,用法是这样的: ${expression}。如果表达式是一个直接调用的,可以省略 {}。 如果表达式的结果为一个对象,则 Dart 会调用对象的 toString() 函数来获取一个字符串。
    还有使用 三个单引号可以写成带格式的字符串

    void main() {
      String s ='''
         这是一个
         有格式的字符串
        还能换行o
         
      ''';
      print('this is a test : $s}');
    }
    

    看下输出样式:


    字符串.png

    还有个比较牛逼的,比如我们在字符中加转义字符,比如\n正常情况下输出会换行,但是如果在字符串前加上小r,则会按原来的输出,看下面例子:

    void main() {                       
    String s =' 测试下 \n 转义字符';        
    String rs =r' 测试下 \n 转义字符';      
      print(s);                      
      print(rs);                     
    }                                
    

    输出结果:


    r_test.png

    Booleans

    这个跟java一样,只有true和false两个值,OC或者JS的同学可能不适应

    后面还有容器的几种类型 List ,Map 等单独讲。

    相关文章

      网友评论

          本文标题:Dart基础_1

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