vb.net switch 문장 Goto Case
-
03-07-2019 - |
문제
vb.net에 스위치 명령문을 사용하는 코드를 작성하고 있지만 다른 블록으로 이동 해야하는 경우 중 하나입니다. C#에서는 다음과 같습니다.
switch (parameter)
{
case "userID":
// does something here.
case "packageID":
// does something here.
case "mvrType":
if (otherFactor)
{
// does something here.
}
else
{
goto default;
}
default:
// does some processing...
break;
}
그러나 이것을 VB.net으로 변환하는 방법을 모르겠습니다. 나는 이것을 시도했다 :
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
GoTo Case Else
End If
Case Else
' does some processing...
Exit Select
End Select
그러나이 작업을 수행하면 컴파일러 오류가 발생합니다. "식별자 예상". "Case"아래에 Squiggly 라인이 있습니다. 어떤 아이디어?
또한이 경우 GOTO 문을 사용하는 것이 잘못입니까? 다시 작성해야 할 다른 방법으로 보입니다.
코드를 다음과 같이 변경했습니다.
If otherFactor AndAlso parameter = "mvrType" Then
'does something here
Else
' My original "Select Case statement" here without the case for "mvrType"
End If
해결책
내가 찾을 수있는 VB.net에는 동등한 것이 없습니다. 이 코드의 경우 리플렉터로 열고 출력 유형을 VB로 변경하여 필요한 코드의 정확한 사본을 얻으려고 할 것입니다. 예를 들어 다음을 반사기에 넣을 때 :
switch (args[0])
{
case "UserID":
Console.Write("UserID");
break;
case "PackageID":
Console.Write("PackageID");
break;
case "MVRType":
if (args[1] == "None")
Console.Write("None");
else
goto default;
break;
default:
Console.Write("Default");
break;
}
다음 vb.net 출력을주었습니다.
Dim CS$4$0000 As String = args(0)
If (Not CS$4$0000 Is Nothing) Then
If (CS$4$0000 = "UserID") Then
Console.Write("UserID")
Return
End If
If (CS$4$0000 = "PackageID") Then
Console.Write("PackageID")
Return
End If
If ((CS$4$0000 = "MVRType") AndAlso (args(1) = "None")) Then
Console.Write("None")
Return
End If
End If
Console.Write("Default")
보시다시피 IF 문으로 동일한 스위치 케이스 문을 달성 할 수 있습니다. 일반적으로 이해하기 어렵 기 때문에 권장하지 않지만 vb.net은 동일한 기능을 지원하지 않는 것 같습니다. 반사기를 사용하는 것이 코드를 사용하는 데 필요한 가장 좋은 방법 일 수 있습니다. 많은 고통.
업데이트:
방금 vb.net에서 똑같은 일을 할 수 없다는 것을 확인했지만 다른 유용한 것들을 지원합니다. IF 명령문 변환이 최선의 방법 또는 일부 리팩토링 인 것 같습니다. Select ... Case의 정의는 다음과 같습니다
다른 팁
왜 그렇게하지 말아야 하는가 :
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
' do processing originally part of GoTo here
Exit Select
End If
End Select
결국 다른 사건이없는 것이 큰 문제인지 아닌지는 확실하지 않지만 IF의 다른 진술에 넣으면 실제로 갈 필요가없는 것 같습니다.
기본 케이스를 메소드로 리팩터링하고 두 곳에서 호출하지 않겠습니까? 이것은 더 읽기 쉬워야하며 나중에보다 효율적인 방식으로 코드를 변경할 수 있습니다.
나는 GOTO를 사용하는 것이 좋은 생각인지 확실하지 않지만 그것을 사용하고 싶다면 다음과 같은 일을 할 수 있습니다.
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
GoTo caseElse
End If
Case Else
caseElse:
' does some processing...
End Select
내가 말했듯이, 그것이 효과가 있지만 Goto는 좋은 관행이 아니므로 여기에 몇 가지 대안 솔루션이 있습니다.
elseif 사용 ...
If parameter = "userID" Then
' does something here.
ElseIf parameter = "packageID" Then
' does something here.
ElseIf parameter = "mvrType" AndAlso otherFactor Then
' does something here.
Else
'does some processing...
End If
부울 가치 사용 ...
Dim doSomething As Boolean
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
doSomething = True
End If
Case Else
doSomething = True
End Select
If doSomething Then
' does some processing...
End If
부울 변수를 설정하는 대신 두 경우 모두 메소드를 직접 호출 할 수도 있습니다 ...
vb.net에서는 다른 조건이 선택 매개 변수에 적용되지 않더라도 여러 조건을 적용 할 수 있습니다. 아래를 참조하십시오 :
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType" And otherFactor
' does something here.
Case Else
' does some processing...
End Select
먼저 레이블을 선언해야합니다.
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
GoTo else
End If
Case Else
else :
' does some processing...
Exit Select
End Select
Select Case parameter
' does something here.
' does something here.
Case "userID", "packageID", "mvrType"
If otherFactor Then
' does something here.
Else
goto case default
End If
Case Else
' does some processing...
Exit Select
End Select
Select Case parameter
' does something here.
' does something here.
Case "userID", "packageID", "mvrType"
' does something here.
If otherFactor Then
Else
goto case default
End If
Case Else
' does some processing...
Exit Select
End Select
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
End If
Case Else
' does some processing...
Exit Select
End Select
GOTO의 이유가 있습니까? IF 기준을 충족하지 않으면 기능을 수행하지 않고 다음 사례로 이동합니다.