返回首页 Dart 语言概览

控制流语句

你可以使用以下任何一种方式来控制你的Dart代码流:

  • if 和 else
  • for 循环
  • while 和 do-while循环
  • break和continue
  • switch和 case
  • assert

你也可以通过使用try-catch和throw来改变控制流,具体说明请见 异常 部分。

if 和 else

Dart支持If语句以及可选的else语句,如样例所示,同样可见包含了 其他运算符(请见上部分)的条件表达式(?:)

     if(isRaining()){   
     you.brinRainCoat();    
     }else if (isSnowing()){   
     you.wearJacket();   
     }else{    
     car.putTopDown();   
     }   

记住,它不同于JavaScript的地方是,Dart将所有不为True的值视作False,如想了解更多相关信息,请见 Booleans 部分。

for 循环

你可以通过For循环实现重复声明,如下例:

     var message = new StringBuffer("Dart is fun");
     for(var i =0 ;i<5;i++){
     message.write(“!”);
     }

Dart的for循环中的闭包能获取循环变量的值,避免了像Javascript中的常见陷阱,如下例,请思考下列代码:

        var callbacks = [];
        for(var  i=0;i<2;i++){
        callbacks.add(() => print(i));
         }
        callbacks.forEach((c) =>c()):

正如我们所期待的,输出结果分别是0和1,但相反的情况可以在Javascript中见到,输出分别为2和2。

如果正在重申的变量是可重申的,你可以使用 forEach()方法。如果你不需要知道重申计数器的值,使用forEach()是一个很好的选择:

       candidates.forEach((candidate) =>candidate.interview());  

可重申的类例如Lish以及Set也支持for-in形式的 iteration

     var collection = [0,1,2];
     for(var x in collection){
     printf(x);
     }

while 和 do-while

while循环在开始之前就对条件进行求值运算:

    while(!isDone()){
    doSomething();
    }

Do-while循环在循环开始之后才对条件进行求值运算:

      do{
      printLine();
      }while(!atEndOfPage());

break 和 continue

使用break来结束循环:

     while(true){
     if(shutDownRequested())break;
     processIncomingRequests();
     }

使用continue来跳过本次循环,进入下次循环:

     for(int i=0;i<candidates.length;i++){
     var candidate = candidates[i];
     if(candidate.yearsExperience <s){
     continue;
     }
     candidate.interview();
     }

你或许可以写出一个不同的例子如果你正在使用例如List或者Set的 Iterable:

    candidates.where((c) => c.yearsExperience >=5)
    .forEach((c) => c.interview());

switch 和 case

Dart中Switch语句通过使用 == 来比较整型,字符串或者编译时间常量。被比较的对象必须都是同一个类(不能是它的任何一个子类型)中的实例,并且这个类不允许覆盖 ==.枚举类型 很适用于在Switch语句。

提示:Dart中的Switch语句是为限制条件而设计的,比如翻译器或者扫描器。

作为规定,每一个不为空的case分句都以break语句结尾.其他正确的结尾方式也可以使用continue,throw或者return语句来实现。 当没有任何case分句的条件符合时,使用default分句来执行代码:

    var command = ‘OPEN’;
    switch (command){
    case ‘CLOSE’:
    executeClosed();
    break;
    case ‘PENDING’:
    executePending();
    break;
    case ‘APPROVED’:
    executeApproved():
    break;
    case ‘DENIED’:
    executeDenied();
    break;
    case ‘OPEN’
    executeOpen();
    break;
    default:
    executeUnknown();
    }

下列的例子漏写了case分句中的break语句,从而产生了一个错误:

    var command = ‘OPEN’
    switch(command){
    case ‘OPEN’:
    executeOpen();
    //错误;缺少了 break 造成了一个异常!!

    case ‘CLOSED’:
    executeClosed();
    break;
    }

然而,Dart支持空的case分句,并允许使用从一个case到另一个case的贯穿形式:

    var command = ‘CLOSED’;
    switch (command){
    case ‘CLOSED’://空的内容造成了贯穿.
    case ‘NOW_CLOSED’:
    // CLOSED 和 NOW_CLOSED两个都会运行.
    executeNowClosed();
    break;
    }

如果你真的想用这种贯穿方式,你可以使用continue语句以及一个标签:

    war command = ‘CLOSED’;
    switch(command){
    case ‘CLOSED’:
    executeClosed();
    continue nowClosed;
    //继续在 nowClosed 标记的地方执行.

    nowClosed:
    case ‘NOW_CLOSED’:
    //CLOSED 和 NOW_CLOSED两个都会运行.
    executeNowClosed();
    break;
    }

一个case分句可以含有局部变量,该局部变量仅仅只在此分句范围内可见。

Assert

如果一个布尔条件值为false,使用assert语句来中断正常执行的代码。你可以在本教程中找到一些assert语句的样例。这里有一些例子:

     //确保这个变量不为空值.
    assert(text != null);

    //确保这个变量小于100.
    assert(number < 100);

    //确保它是一个https协议类型的URL.
    assert(urlString.startsWith(‘https’));
提示:Assert语句仅仅只能在调试模式下使用,在生产模式下没有任何作用。

在assert语句后面的括号中,你可以加入任何表示布尔值或者函数的表达式。如果表达式的值或者函数返回值true,则assert语句成功并继续执行代码。如果值为false,则assert语句失败并抛出一个异常 (an AssertionError)。

上一篇: 操作符 下一篇: 异常