代码之家  ›  专栏  ›  技术社区  ›  slee423

为什么在将VB.NET代码迁移到C#时for循环的行为会有所不同?

  •  86
  • slee423  · 技术社区  · 7 年前

    for 已声明正在使用的循环。

    在VB.NET中 对于 循环声明如下:

    Dim stringValue As String = "42"
    
    For i As Integer = 1 To 10 - stringValue.Length
       stringValue = stringValue & " " & CStr(i)
       Console.WriteLine(stringValue)
    Next
    

    42 1
    42 1 2
    42 1 2 3
    42 1 2 3 4
    42 1 2 3 4 5
    42 1 2 3 4 5 6
    42 1 2 3 4 5 6 7
    42 1 2 3 4 5 6 7 8
    

    在C#the 循环声明如下:

    string stringValue = "42";
    
    for (int i = 1; i <= 10 - stringValue.Length; i ++)
    {
       stringValue = stringValue + " " + i.ToString();
       Console.WriteLine(stringValue);
    }
    

    以及输出:

    42 1
    42 1 2
    42 1 2 3
    

    请参见下面的代码:

    string stringValue = "42";
    int stringValueLength = stringValue.Length;
    
    for (int i = 1; i <= 10 - stringValueLength; i ++)
    {
       stringValue = stringValue + " " + i.ToString();
       Console.WriteLine(stringValue);
    }
    

    42 1
    42 1 2
    42 1 2 3 4
    42 1 2 3 4 5 6
    42 1 2 3 4 5 6 7
    42 1 2 3 4 5 6 7 8
    

    现在我的问题解决了,在使用 stringValue.Length 对于 循环,即使每次循环发生时字符串的长度都会改变。如果我用 对于

    4 回复  |  直到 7 年前
        1
  •  115
  •   Andrew Morton    7 年前

    在C#中,循环边界条件在每次迭代中都要求值。在VB.NET中,它只在进入循环时进行计算。

    stringValue

    在VB.NET中,final条件是包含的,因此您可以使用 <= 而不是 < 在C#。

    C#中的结束条件评估有一个推论,即即使它没有变化,但计算起来很昂贵,那么它应该在循环之前只计算一次。

        2
  •  22
  •   Camilo Terevinto Chase R Lewis    7 年前

    现在我的问题解决了VB与C的区别,即VB在for循环中使用stringValue.Length条件,即使每次循环发生时字符串的长度都会改变。

    根据 VB.NET 文档:

    counter start , end ,或 step 不影响首次进入循环时确定的迭代值。

    所以,价值 To 10 - stringValue.Length 一次求值并重复使用,直到循环退出。

    但是,看看 c#'s for statement

    for_condition 不存在或评估结果 true ,控件被传输到嵌入语句。当控件到达嵌入语句的端点时(可能是执行continue语句),则 for_iterator 对于\u条件

    这基本上意味着 ; i <= 10 - stringValueLength; 每次都要重新评估。

    因此,如您所见,如果您想复制代码,您需要在开始循环之前用c#声明最后一个计数器。

        3
  •  11
  •   camerondm9    7 年前

    for循环 进入之内 C级# while循环。

    VB.NET版

    string stringValue = "42";
    
    int min = 1;
    int max = 10 - stringValue.Length;
    int i = min;
    while (i <= max)
    {
        stringValue = stringValue + " " + stringValue.Length.ToString();
        Console.WriteLine(stringValue);
        i++;
    }
    

    C级#

    string stringValue = "42";
    
    int i = 1;
    while (i <= 10 - stringValue.Length)
    {
        stringValue = stringValue + " " + stringValue.Length.ToString();
        Console.WriteLine(stringValue);
        i++;
    }
    

    区别在于:

    VB.NET版 缓存的最大值 i C级# 每次都重新计算。

        4
  •  7
  •   C Robinson    7 年前

    因为 for 对于 使用C#(或任何其他类似C的语言)

    对于 语句具体地将计数器从一个值递增到另一个值。

    对于

    • 第一个表达式通常是初始化
    • 第二个表达式在每次迭代开始时求值,以确定是否满足终止条件

    必须 提供一个数字变量,可以根据终值进行测试,并在每次迭代中递增

    因此,在C#等中,条件表达式必须在每次迭代时完全求值,而在VB中,迭代器的终值必须在开始时求值,不需要再次求值。