![](/img/trans.png)
[英]Why do the division (/) operators behave differently in VB.NET and C#?
[英]Why does a for loop behave differently when migrating VB.NET code to C#?
我正在将项目从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在Visual Basic中如何使用for
循环中的stringValue.Length
条件与C#的区别,即使每次循环发生时字符串的长度发生变化。 而在C#中,如果我在for
循环条件中使用stringValue.Length
,则每次循环发生时都会更改初始字符串值。 为什么是这样?
在C#中,在每次迭代时评估循环边界条件。 在VB.NET中,它仅在进入循环时进行评估。
因此,在问题的C#版本中,因为stringValue
的长度在循环中被更改,所以最终的循环变量值将被更改。
在VB.NET中,最终条件是包容性的,因此在C#中使用<=
而不是<
。
C#中的结束条件评估具有一个必然结果,即即使它没有变化但计算成本很高,那么它应该在循环之前计算一次。
现在我的问题解决了VB在VB中使用for循环中的stringValue.Length条件与C#的区别,即使每次循环发生时,字符串的长度也会发生变化。
根据VB.NET文档:
如果在循环内部更改
counter
的值,则代码可能更难以读取和调试。 更改start
,end
或step
的值不会影响首次输入循环时确定的迭代值。
因此, To 10 - stringValue.Length
的值被计算一次并重复使用,直到循环退出。
但是,请查看c#的声明
如果
for_condition
不存在或者评估结果为true
,则控制权转移到嵌入语句。 当控制到达嵌入语句的结束点时(可能来自执行continue语句),for_iterator
的表达式(如果有的话)按顺序计算,然后执行另一次迭代,从评估for_condition
开始上面的一步。
这基本上意味着条件; i <= 10 - stringValueLength;
; i <= 10 - stringValueLength;
每次都要再次评估。
因此,如您所见,如果您想复制代码,则需要在开始循环之前在c#中声明最终计数器。
为了使示例更容易理解,我将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#每次都重新计算它。
因为for
在VB是一个不同的语义比for
在C#(或任何其他类似C语言)
在VB中, for
语句专门将计数器从一个值递增到另一个值。
在C,C ++,C#等中, for
语句只是简单地计算三个表达式:
在VB中,您必须提供一个数字变量,可以针对终端值进行测试,并在每次迭代时递增
在C,C ++,C#等中,三个表达式受到最小约束; 条件表达式必须求值为真/假(或C,C ++中的整数零/非零)。 您根本不需要执行初始化,可以在任何值范围内迭代任何类型,在复杂结构上迭代指针或引用,或者根本不迭代任何内容。
因此,在C#等中,必须在每次迭代时完全评估条件表达式,但在VB中,必须在开始时评估迭代器的终值,而不需要再次计算。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.