zoukankan      html  css  js  c++  java
  • dart语法

     变量声明

    1.var 类似于JavaScript中的var,它可以接收任何类型的变量,但最大的不同是Dart中var变量一旦赋值,类型便会确定,则不能再改变其类型,如:
        var t;
        t="hi world";
        // 下面代码在dart中会报错,因为变量t的类型已经确定为String,
        // 类型一旦确定后则不能再更改其类型。
        t=1000;
    
        上面的代码在JavaScript是没有问题的,前端开发者需要注意一下,之所以有此差异是因为Dart本身是一个强类型语言,任何变量都是有确定类型的,在Dart中,当用var声明一个变量后,Dart在编译时会根据第一次赋值数据的类型来推断其类型,编译结束后其类型就已经被确定,而JavaScript是纯粹的弱类型脚本语言,var只是变量的声明方式而已。
    2.dynamic和Object
        Dynamic和Object 与 var功能相似,都会在赋值时自动进行类型推断,不同在于,赋值后可以改变其类型,如:
        dynamic t;
        t="hi world";
        //下面代码没有问题
        t=1000;
    
        Object 是dart所有对象的根基类,也就是说所有类型都是Object的子类,所以任何类型的数据都可以赋值给Object声明的对象,所以表现效果和dynamic相似。
    3.final和const
        如果您从未打算更改一个变量,那么使用 final 或 const,不是var,也不是一个类型。 一个 final 变量只能被设置一次,两者区别在于:const 变量是一个编译时常量,final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略,如:
        //可以省略String这个类型声明
        final str = "hi world";
        //final str = "hi world"; 
        const str1 = "hi world";
        //const String str1 = "hi world"

    console变为print

    Dart语言时,请记住以下事实和概念:

    • 任何保存在变量中的都是一个 对象 , 并且所有的对象都是对应一个 类 的实例。 无论是数字,函数和 null 都是对象。所有对象继承自 Object 类。

    • 尽管 Dart 是强类型的,但是 Dart 可以推断类型,所以类型注释是可选的。 在上面的代码中, number 被推断为 int 类型。 如果要明确说明不需要任何类型, 需要使用特殊类型 dynamic 。

    • Dart 支持泛型,如 List<int> (整数列表)或 List<dynamic>(任何类型的对象列表)。

    • Dart 支持顶级函数(例如 main() ), 同样函数绑定在类或对象上(分别是 静态函数 和 实例函数 )。 以及支持函数内创建函数 ( 嵌套 或 局部函数 ) 。

    • 类似地, Dart 支持顶级 变量 , 同样变量绑定在类或对象上(静态变量和实例变量)。 实例变量有时称为字段或属性。

    • 与 Java 不同,Dart 没有关键字 “public” , “protected” 和 “private” 。 如果标识符以下划线( _)开头,则它相对于库是私有的。 有关更多信息,参考 库和可见性

    • 标识符 以字母或下划线( _)开头,后跟任意字母和数字组合。

    • Dart 语法中包含 表达式( expressions )(有运行时值)和 语句( statements )(没有运行时值)。 例如,条件表达式 condition ? expr1 : expr2 的值可能是 expr1 或 expr2 。 将其与 if-else 语句 相比较,if-else 语句没有值。 一条语句通常包含一个或多个表达式,相反表达式不能直接包含语句。

    • Dart 工具提示两种类型问题:警告_和_错误。 警告只是表明代码可能无法正常工作,但不会阻止程序的执行。 错误可能是编译时错误或者运行时错误。 编译时错误会阻止代码的执行; 运行时错误会导致代码在执行过程中引发 异常

    #关键字

    Dart 语言关键字列表。

    abstract 2 dynamic 2 implements 2 show 1
    as 2 else import 2 static 2
    assert enum in super
    async 1 export 2 interface 2 switch
    await 3 extends is sync 1
    break external 2 library 2 this
    case factory 2 mixin 2 throw
    catch false new true
    class final null try
    const finally on 1 typedef 2
    continue for operator 2 var
    covariant 2 Function 2 part 2 void
    default get 2 rethrow while
    deferred 2 hide 1 return with
    do if set 2 yield 3

    避免使用这些单词作为标识符。 但是,如有必要,标有上标的关键字可以用作标识符:

    • 带有 1 上标的单词为 上下文关键字, 仅在特定位置具有含义。 他们在任何地方都是有效的标识符。

    • 带有 2 上标的单词为 内置标识符, 为了简化将 JavaScript 代码移植到 Dart 的工作, 这些关键字在大多数地方都是有效的标识符, 但它们不能用作类或类型名称,也不能用作 import 前缀。

    • 带有 3 上标的单词是与 Dart 1.0 发布后添加的异步支持相关的更新,作为限制类保留字。 不能在标记为 async ,async 或 sync* 的任何函数体中使用 await 或 yield 作为标识符。

    关键字表中的剩余单词都是保留字。 不能将保留字用作标识符。

     Dart 函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。

      1.函数声明

        bool isNoble(int atomicNumberreturn _nobleGases[atomicNumber!= null}

      2.如果没有显式声明返回值类型时会默认当做dynamic

      3.可以使用箭头函数

      4.函数作为变量  var say=(str){ print(str)}

      5.函数作为参数传递 callback回调

      6.可选的命名参数

    异步支持 asyncawait关键词支持了异步编程,允许您写出和同步代码很像的异步代码。

    Future/Future.then/Future.catchError/Future.whenComplete/Future.wait

    Future.then

    //Duration延迟2秒执行

    Future.delayed(new Duration(seconds: 2),(){ return "hi world!"; }).then((data){ print(data); });

    Future.catchError

    //异步任务发生错误,在catchError中捕获错误
    Future.delayed(new Duration(seconds: 2),(){
       //return "hi world!";
       throw AssertionError("Error");  
    }).then((data){
       //执行成功会走到这里  
       print("success");
    }).catchError((e){
       //执行失败会走到这里  
       print(e);
    });

    Future.whenComplete  无论成功或失败都会走到这里

    Future.delayed(new Duration(seconds: 2),(){
       //return "hi world!";
       throw AssertionError("Error");
    }).then((data){
       //执行成功会走到这里 
       print(data);
    }).catchError((e){
       //执行失败会走到这里   
       print(e);
    }).whenComplete((){
       //无论成功或失败都会走到这里
    });

    Future.wait 等待多个异步任务执行结束后才进行的操作,wait[ajax1,ajax2,ajax3]

    Async/await JavaScript中的async/await功能和用法是一模一样的

    task() async {
       try{
        String id = await login("alice","******");
        String userInfo = await getUserInfo(id);
        await saveUserInfo(userInfo);
        //执行接下来的操作   
       } catch(e){
        //错误处理   
        print(e);   
       }  
    } 

      

    @Override标签的作用:

    @Override是伪代码,表示方法重写。

    @Override标签的好处:

    1.作为注释,帮助自己检查是否正确的复写了父类中已有的方法

    2.便于别人理解代码

    3.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.

    例如:在重写父类的service时,在方法前面加上@Override 系统可以帮你检查方法的正确性。

    1
    2
    3
    4
    5
    6
    7
    public class AdminServlet extends HttpServlet{
        @Override  //表示方法重写
        protected void service(HttpServletRequest req,HttpServletResponse resp)
        throws ServletException,IOException{
            req.setCharacterEncoding("utf-8");
        }
    }

    如果将方法错误写为Service

  • 相关阅读:
    【程序员面试宝典】第五章 程序设计基本概念
    win7打开或关闭windows功能 提示“出现错误,并非所有的功能被更改”,管理员权限惹的祸
    堆排序
    目态与管态的概念
    循环不变式的概念
    getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析
    java算法 -- 冒泡排序
    Java算法 -- 二分查找
    Sql知识点总结
    java实现 链表反转
  • 原文地址:https://www.cnblogs.com/chenzxl/p/13508907.html
Copyright © 2011-2022 走看看