【问题标题】:Why is i++ "unreachable code"?为什么 i++ 是“无法访问的代码”?
【发布时间】:2014-04-29 16:05:09
【问题描述】:

编辑

我把它留在这里,即使它让我看起来很愚蠢,因为如果你在深夜工作并且不注意,它可能会咬你。感谢 Visual Studio 拥有如此智能的解析器。

基本上我错过了我有嵌套循环,所以continue 语句在这里基本上毫无价值,因为它继续foreach 循环,而不是for 循环。

原始问题

我正在对工作簿进行搜索,寻找与所有字符串搜索条件匹配的工作表。在 Visual Studio 编辑器中,i++ 下划线为“无法访问的代码”。

/// <summary>
/// Finds the first sheet that has cells that match all the criteria.
/// </summary>
/// <param name="wb"></param>
/// <param name="searches"></param>
/// <returns></returns>
public static ISheet FindSheet( this IWorkbook wb, params string[] searches )
{
    if( null == wb || null == searches )
        return null;

    for( int i = 0; i < wb.NumberOfSheets; i++ )
    {
        var sheet = wb.GetSheetAt( i );
        foreach( var search in searches )
        {
            var cell = sheet.FindCell( search );
            if( null == cell )
                continue;
        }

        return sheet;
    }

    return null;
}

我认为continue 语句在这里有一个明确的含义:“如果任何搜索条件返回null 单元格,则继续下一次迭代。否则,只需返回在此迭代中找到的工作表。”

没有继续声明的更正代码

/// <summary>
/// Finds the first sheet that has cells that match all the criteria.
/// </summary>
/// <param name="wb"></param>
/// <param name="searches"></param>
/// <returns></returns>
public static ISheet FindSheet( this IWorkbook wb, params string[] searches )
{
    if( null == wb || null == searches )
        return null;

    for( int i = 0; i < wb.NumberOfSheets; i++ )
    {
        var sheet = wb.GetSheetAt( i );
        if( searches.All( s => null != sheet.FindCell( s ) ) )
            return sheet;
    }

    return null;
}

【问题讨论】:

标签: c# loops visual-studio


【解决方案1】:

在这里,您的 for 循环完全没用。在第一次迭代之后,无论如何它都会返回。当然你的 foreach 循环有一个continue 语句,但这仅适用于foreach 循环。这就是您的代码无法访问的原因。

因此,将只分析第一张纸。如果这是您想要的,您可以简单地删除 for 循环并将工作表定位到索引 0,或者您需要重新排列循环。

【讨论】:

  • 因为离 continue 语句最近的循环是 foreach 循环。在 Java 中,他可以命名循环并指定要继续的循环,但在 C# 中不能这样做。
  • 谢谢。我在您回答时发布了编辑。我将此标记为答案。
  • 通过犯这种错误,你可以学习语言的机制。别担心,我们都去过那里。 ^^
【解决方案2】:

Eric Lippert 有an SO answera blog post 说明当您处于内循环时想要继续外循环时可以做什么。

他标记为“真棒”的技术是在可能的情况下摆脱所有循环,事实上我相信这里是可能的:

public static ISheet FindSheet( this IWorkbook wb, params string[] searches )
{
    if( null == wb || null == searches ) { return null; }

    return wb.FirstOrDefault(sh => searches.All(sr => sh.FindCell(sr) != null));
}

【讨论】:

  • 不错。我现在才意识到IWorkbook 也是IEnumerable&lt;ISheet&gt; 所以这是一个很好的解决方案。
  • 我刚刚意识到您的方法与 Eric 的示例具有完全相同的目的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2020-08-27
  • 2021-10-06
  • 2017-01-02
  • 1970-01-01
  • 2012-04-11
相关资源
最近更新 更多