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 이 Visual Basic C#을 과 C 다른지에 되었습니다.stringValue.Length
for
루프가 발생할 때마다 문자열의 길이가 변경되더라도 루프가 발생합니다.반면에 C#에서는 만약 내가 그것을 사용한다면.stringValue.Length
에 시대에for
루프 조건은 루프가 발생할 때마다 초기 문자열 값을 변경합니다.왜 이러한가?
C#에서 루프 경계 조건은 각 반복에서 평가됩니다.VB.NET에서는 루프에 대한 항목에서만 평가됩니다.
가 그서래, 의질 C# 서에, 가이길버, 문전▁the▁so, 길가이▁of의stringValue
루프에서 변경 중이며, 최종 루프 변수 값이 변경됩니다.
되므로 VB를 합니다.NET에서는 최종 조건이 포함되므로 다음을 사용합니다.<=
에 <
C#로
C#의 최종 조건 평가는 변동이 없지만 계산 비용이 많이 들더라도 루프 전에 한 번만 계산해야 한다는 결과를 낳습니다.
이제 VB가 문자열 Value를 사용하는 VB 측면에서 C#과 어떻게 다른지에 대한 질문이 해결되었습니다.루프가 발생할 때마다 문자열의 길이가 변경되더라도 for 루프의 길이 조건입니다.
VB.NET 설명서에 따르면:
당신이 는하경우의 한다면,
counter
루프 안에 있는 동안 코드를 읽고 디버깅하기가 더 어려울 수 있습니다.의 값start
,end
또는step
루프가 처음 입력되었을 때 결정된 반복 값에는 영향을 주지 않습니다.
그서의 값, 그가는의 값.To 10 - stringValue.Length
한 번 평가되고 루프가 종료될 때까지 재사용됩니다.
그러나 c#의 문장을 확인합니다.
에 약에만.
for_condition
결과가 산출된true
컨트롤이 포함된 문으로 전송됩니다.제어가 포함된 문의 끝점에 도달하는 경우(가능하면 연속 문의 실행으로),for_iterator
만약 있다면, 순차적으로 평가되고, 그리고 나서, 평가를 시작으로 다른 반복이 수행됩니다.for_condition
상기 단계에서
그 말은 기본적으로 그 상태가; i <= 10 - stringValueLength;
매번 다시 평가됩니다.
따라서 코드를 복제하려면 루프를 시작하기 전에 c#로 최종 카운터를 선언해야 합니다.
예제를 보다 쉽게 이해할 수 있도록 루프에 대한 두 가지를 C#로 변환하는 한편 루프를 수행합니다.
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# 등에서는 세 가지 식을 최소로 제한합니다. 조건식은 true/false(또는 C++에서는 정수 0/non-zero)로 평가해야 합니다.초기화를 수행할 필요가 전혀 없으며, 값 범위에 상관없이 모든 유형을 반복하거나, 복잡한 구조에 대해 포인터나 참조를 반복하거나, 아무 것도 반복할 수 없습니다.
따라서 C# 등에서는 각 반복에서 조건식을 완전히 평가해야 하지만, VB에서는 반복기의 터미널 값을 처음부터 평가해야 하며, 다시 평가할 필요가 없습니다.
언급URL : https://stackoverflow.com/questions/52607611/why-does-a-for-loop-behave-differently-when-migrating-vb-net-code-to-c
'programing' 카테고리의 다른 글
FutureWarning: 요소별 비교 실패. 스칼라를 반환하지만 나중에 요소별 비교가 수행됩니다. (0) | 2023.05.20 |
---|---|
파이썬을 사용하여 Excel 문서 구문 분석 (0) | 2023.05.20 |
C#에서 복싱과 언복싱이 필요한 이유는 무엇입니까? (0) | 2023.05.20 |
종료 코드 1( 호출을 보려면 -v 사용), Xcode 8, Swift 3에서 링커 명령이 실패했습니다. (0) | 2023.05.15 |
출시 후 iOS 앱에 디버거를 연결하는 방법은 무엇입니까? (0) | 2023.05.15 |