17

我有下面的代码(实际上比你看到的要长得多!)

foreach (SensorPair sensor in _sensorPairs)
{
    sensorByte = (byte) sensor.Sensor;

    if (!packet.Contains(sensorByte))
        continue;

    index = packet.IndexOf(sensorByte);
    byteCount = sensor.ByteCount;

    switch (byteCount)
    {
        case 1:
            try
            {
                switch(sensor.ValueType)
                {
                    case SensorValueType.Unsigned:
                        val = (int)packet[index + 1];
                        if (val > 255)
                            //*** WHAT DOES THIS CONTINUE DO?
                            continue;   
                        else //rise the event
                           OnSensorReport();                              
                    break;

您看到的关键字是否continue会导致 foreach 循环开始迭代下一个项目,或者它只是传递到下一个case语句?

如果它对 foreach 循环没有做任何事情,我如何强制代码退出开关并在 foreach 循环中开始下一次迭代?

4

1 回答 1

32

是的,它继续foreach循环。

查阅文档总是有用的;-)

continue 语句将控制权传递给包含它的 while、do、for 或 foreach 语句的下一次迭代。

或者更全面的C# 语言规范

8.9.2 continue 语句

continue 语句开始最近的封闭 while、do、for 或 foreach 语句的新迭代。

continue 语句的目标是最近的封闭 while、do、for 或 foreach 语句的嵌入语句的终点。如果 continue 语句未包含在 while、do、for 或 foreach 语句中,则会发生编译时错误。

当多个 while、do、for 或 foreach 语句相互嵌套时, continue 语句仅适用于最里面的语句。要跨多个嵌套级别转移控制,必须使用 goto 语句(第 8.9.3 节)。

continue 语句不能退出 finally 块(第 8.10 节)。当 continue 语句出现在 finally 块中时, continue 语句的目标必须在同一个 finally 块中;否则会发生编译时错误。

continue 语句执行如下:

  • 如果 continue 语句退出一个或多个带有相关 finally 块的 try 块,则控制最初转移到最里面的 try 语句的 finally 块。当控制到达 finally 块的终点时,控制将转移到下一个封闭 try 语句的 finally 块。重复此过程,直到所有介入的 try 语句的 finally 块都已执行。

  • 控制转移到 continue 语句的目标。

因为 continue 语句无条件地将控制转移到别处,所以 continue 语句的终点永远无法到达。

于 2013-01-07T22:17:28.463 回答