c# - 为什么将 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.NET 中,它仅在进入循环时进行评估。
因此,在问题中的 C# 版本中,由于stringValue
在循环中更改了 的长度,因此最终的循环变量值将被更改。
在 VB.NET 中,最终条件是包容性的,因此您将在 C# 中使用<=
而不是。<
C# 中的结束条件评估有一个推论,即使它没有变化但计算成本很高,那么它也应该在循环之前只计算一次。
推荐阅读
- javascript - 将点击事件绑定到输入元素
- java - 我尝试制作 javax.ws.rs.core.Response 时 servicemix 中的异常
- xml - XML 中的 pad、pad-front 函数
- python - 在另一个模块中使用 python 方法
- ios - 编译错误:kFirLoggerSwizzler 引用自
- macos - MacOS 中的键盘记录器
- javascript - GraphQL 类型:什么是正确的分桶?
- azure - 如何在 azure 中重命名多个 VM 主机名\如何从具有不同主机名的自定义映像部署多个 VM 实例
- ios - iOS:通过单击按钮增加动画
- sql - 日期或字符串类型为 bigint