首页 > 解决方案 > 为什么将 VB.NET 代码迁移到 C# 时,for 循环的行为会有所不同?

问题描述

我正在将项目从 Visual Basic 迁移到 C#,并且我不得不更改for声明使用的循环的方式。

在 VB.NET 中,for循环声明如下:

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# 中,for循环声明如下:

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
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

现在我的问题解决了 Visual Basic 与 C# 在 Visual Basic 方面的不同之处,即使用循环stringValue.Length中的条件,for即使每次循环发生时字符串的长度都会发生变化。而在 C# 中,如果我使用循环stringValue.Length中的for条件,它会在每次循环发生时更改初始字符串值。为什么是这样?

标签: c#vb.netloopsfor-loop

解决方案


在 C# 中,每次迭代都会评估循环边界条件。在 VB.NET 中,它仅在进入循环时进行评估。

因此,在问题中的 C# 版本中,由于stringValue在循环中更改了 的长度,因此最终的循环变量值将被更改。

在 VB.NET 中,最终条件是包容性的,因此您将在 C# 中使用<=而不是。<

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


推荐阅读