문제

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의 정의는 다음과 같습니다

http://msdn.microsoft.com/en-us/library/cy37t14y.aspx

다른 팁

왜 그렇게하지 말아야 하는가 :

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 기준을 충족하지 않으면 기능을 수행하지 않고 다음 사례로 이동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top