programing

VB.NET 코드를 C#로 마이그레이션할 때 for 루프가 다르게 작동하는 이유는 무엇입니까?

javamemo 2023. 5. 20. 00:22
반응형

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#은 매번 다시 계산합니다.

왜냐하면.forVB에서는 다음과 다른 의미입니다.forC#(또는 다른 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

반응형