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
이제 내 질문 은 루프가 발생할 때마다 문자열의 길이가 변경 되더라도 루프 의 stringValue.Length
조건을 사용하여 Visual Basic 측면에서 Visual Basic이 C #과 어떻게 다른지에 대해 해결합니다 for
. 반면 C # stringValue.Length
에서는 for
루프 조건 에서 사용 하면 루프가 발생할 때마다 초기 문자열 값이 변경됩니다. 왜 이런거야?
답변
C #에서 루프 경계 조건은 각 반복에서 평가됩니다. VB.NET에서는 루프 진입시에만 평가됩니다.
따라서 질문의 C # 버전 stringValue
에서는 루프에서 길이 가 변경되므로 최종 루프 변수 값이 변경됩니다.
VB.NET에서는 최종 조건이 포괄적이므로 C # <=
대신 사용 합니다 <
.
C #의 종료 조건 평가에는 변하지 않지만 계산하는 데 비용이 많이 들더라도 루프 전에 한 번만 계산해야한다는 결론이 있습니다.
답변
이제 내 질문은 루프가 발생할 때마다 문자열 길이가 변경 되더라도 for 루프에서 stringValue.Length 조건을 사용하여 VB 측면에서 VB가 C #과 어떻게 다른지에 대해 해결합니다.
VB.NET 문서 에 따르면 :
counter
루프 내에서 while 값을 변경하면 코드를 읽고 디버그하기가 더 어려울 수 있습니다. 의 값을 변경start
,end
또는step
루프가 처음 입력 할 때 결정되었다 반복 값에 영향을주지 않습니다.
따라서의 값은 To 10 - stringValue.Length
한 번 평가되고 루프가 종료 될 때까지 재사용됩니다.
그러나 C #의 for 문을 살펴보십시오 .
(가) 경우
for_condition
본이나 평가 수율 아닌 경우true
, 제어는 삽입 명령문에 전송된다. 제어가 포함 된 문의 끝점에 도달하면 (아마도 continue 문의 실행에서)의 식 (for_iterator
있을 경우)이 순서대로 평가 된 다음for_condition
단계의 평가부터 시작하여 다른 반복이 수행 됩니다. 위.
이는 기본적으로 조건 ; 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++;
}
씨#
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
in VB는 for
in C # (또는 다른 C와 유사한 언어)과 다른 의미 이기 때문에
VB에서 for
명령문은 특히 한 값에서 다른 값으로 카운터를 증가시킵니다.
C, C ++, C # for
등에서이 명령문은 단순히 세 가지 표현식을 평가합니다.
- 첫 번째 표현식은 일반적으로 초기화입니다.
- 두 번째 표현식은 각 반복이 시작될 때 평가되어 최종 조건이 충족되었는지 여부를 판별합니다.
- 세 번째 표현식은 일반적으로 증분자인 각 반복이 끝날 때 평가됩니다.
VB에서는 터미널 값에 대해 테스트 할 수 있고 각 반복에서 증가 할 수있는 숫자 변수를 제공 해야합니다.
C, C ++, C # 등에서 세 가지 식은 최소한으로 제한됩니다. 조건식은 참 / 거짓 (또는 C, C ++에서 0이 아닌 정수)으로 평가되어야합니다. 초기화를 전혀 수행 할 필요가 없습니다. 값의 범위에 관계없이 모든 유형을 반복하거나, 복잡한 구조에 대해 포인터 또는 참조를 반복하거나, 아무것도 반복하지 않을 수 있습니다.
따라서 C # 등에서는 각 반복에서 조건식을 완전히 평가해야하지만 VB에서는 반복기의 터미널 값을 처음에 평가해야하며 다시 평가할 필요가 없습니다.