C# 对于循环-“检测到无法访问的代码”-测试

C# 对于循环-“检测到无法访问的代码”-测试,c#,object,for-loop,methods,tdd,C#,Object,For Loop,Methods,Tdd,我需要通过以下测试: [TestMethod] public void ShouldRepeatANumberOfTimes() { Simon simon = new Simon(); Assert.AreEqual("hello hello hello", simon.Repeat("hello", 3)); //So if parameter 3 was to be exchanged with 7, it would write "hello" seven ti

我需要通过以下测试:

[TestMethod]
public void ShouldRepeatANumberOfTimes()
{
    Simon simon = new Simon();
    Assert.AreEqual("hello hello hello", simon.Repeat("hello", 3)); 
    //So if parameter 3 was to be exchanged with 7, it would write "hello" seven times in one sentence.
}
对于这个任务,我认为For循环是一个自然的解决方案。所以我试了一下:

internal object Repeat(string v1, int v2)
{
    for (int i = 0; i < v2; i++)
    {
        return "hello ";
    }

    return v1;
}
我得到以下错误:

检测到无法访问的代码


具体地说,i++中的i下面有一条错误行。有人能发现出什么问题吗?提前感谢。

由于for循环中有行“return hello”,因此您将无法访问行“return v1”。因此,您的程序退出for循环。

您将无法到达行“return v1”,因为for循环中有行“return hello”。因此,您的程序退出for循环。

在第一次迭代i=0之后,您的方法将返回hello;因此i++永远不会被执行。此外,由于您已经返回了其他内容,因此您将无法到达行return v1。您似乎希望返回hello v2 times+v1,因此您的代码应该类似于下面的用法说明:

在第一次迭代i=0之后,您的方法返回hello;因此i++永远不会被执行。此外,由于您已经返回了其他内容,因此您将无法到达行return v1。您似乎希望返回hello v2 times+v1,因此您的代码应该类似于下面的用法说明:

应该行得通

internal object Repeat(string v1, int v2)
{
    var str = "";

    for (int i = 0; i < v2; i++)
    {
        str += " " + v1;
    }

    return str.Trim();
}

它应该能工作

internal object Repeat(string v1, int v2)
{
    var str = "";

    for (int i = 0; i < v2; i++)
    {
        str += " " + v1;
    }

    return str.Trim();
}

由于您总是在第一次迭代中返回某些内容,因此您只能运行一次循环。因此,for循环中的i++永远不会执行

此外,正如Devin Liu正确指出的,从循环内部返回某些内容也会使从外部返回的v1无法访问,因为您以前总是返回某些内容。

由于您在第一次迭代中总是返回某些内容,因此您只运行过一次循环。因此,for循环中的i++永远不会执行


此外,正如Devin Liu正确指出的,从循环内部返回某些内容也会使从外部返回的v1无法访问,因为您以前总是返回某些内容。

您遇到的问题比该错误更多:

在您的循环中,您总是返回hello,而与v1无关

您在第一次迭代时返回hello,因此它永远不会返回v1;线

如果将0作为第二个参数传递,它仍然会从上次返回调用返回v1一次

即使在你修复了这个函数之后,如果你把它叫做simon.Repeathello,3,结果也会是HelloHello

您可以将函数重写修复为:

    String reps = String.Empty;

    for (int i = 0; i < v2; i++)
    {
        reps = string.Concat(reps, v1);
    }

    return reps;

您遇到的问题比该错误还多:

在您的循环中,您总是返回hello,而与v1无关

您在第一次迭代时返回hello,因此它永远不会返回v1;线

如果将0作为第二个参数传递,它仍然会从上次返回调用返回v1一次

即使在你修复了这个函数之后,如果你把它叫做simon.Repeathello,3,结果也会是HelloHello

您可以将函数重写修复为:

    String reps = String.Empty;

    for (int i = 0; i < v2; i++)
    {
        reps = string.Concat(reps, v1);
    }

    return reps;

正如其他人提到的,您的函数将始终结束于这一行

return "hello ";
要重复字符串,可以使用类似这样的内容,而无需任何循环

return string.Join(" ", Enumerable.Repeat("Hello", 2));

只需将这一行放在函数中,并将Hello和2替换为您的参数

,正如前面提到的,您的函数将始终以这一行结束

return "hello ";
要重复字符串,可以使用类似这样的内容,而无需任何循环

return string.Join(" ", Enumerable.Repeat("Hello", 2));

只需将这一行放在函数中,并将Hello和2替换为参数

此方法将返回字符串而不是列表,并添加正确数量的空格,因为测试用例没有尾随空格

internal object Repeat(string v1, int v2)
{

    var output = string.empty;
    for (int i = 0; i < v2; i++)
    {
        output += v1;
        if(i <= v2-1)
        {
            output += " ";
        }
    }

    return output ;
}
我推荐以下几种其他方法: 如果您认为您将构建非常大的字符串,我建议改用StringBuilder,我不仅仅是为了尽快编写。
您还可以删除循环末尾的尾随空格,我只是不希望从一开始就添加它。

此方法将返回一个字符串而不是一个空格列表,并添加正确数量的空格,因为测试用例没有尾随空格

internal object Repeat(string v1, int v2)
{

    var output = string.empty;
    for (int i = 0; i < v2; i++)
    {
        output += v1;
        if(i <= v2-1)
        {
            output += " ";
        }
    }

    return output ;
}
我推荐以下几种其他方法: 如果您认为您将构建非常大的字符串,我建议改用StringBuilder,我不仅仅是为了尽快编写。
也可以删除循环末尾的尾随空格,我只是不希望从一开始就添加它。

函数在第一个return语句之后返回…您误解了return的工作原理。函数在第一个return语句之后返回…您误解了return的工作原理。str应该以空字符串开头,老实说,我不完全理解函数应该做什么。它应该向v1添加hello v2次,或者返回v1重复v2次?上面有一个测试显示了预期的输出。已更新。是我的错。@你能解释一下它是怎么工作的吗?我
它还回来了吗?您希望返回什么?str应该以空字符串开头,或者i应该以1开头。老实说,我不完全理解函数应该做什么。它应该向v1添加hello v2次,或者返回v1重复v2次?上面有一个测试显示了预期的输出。已更新。是我的错。@你能解释一下它是怎么工作的吗?它返回了什么?您希望返回什么?返回v1是可访问的。当v2为0时,则循环从不运行。返回v1是可到达的。当v2为0时,则循环从不运行。当v2为0时,没有循环的第一次迭代。当v2为0时,没有循环的第一次迭代。