VB.NET Switch Statement GoTo Case

Ik ben wat code aan het schrijven in VB.NET die een switch-statement gebruikt, maar in een van de gevallen moet het naar een ander blok springen. In C# ziet het er als volgt uit:

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;
}

Ik weet echter niet hoe ik dit moet converteren naar VB.NET. Ik heb dit geprobeerd:

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     

Maar als ik dit doe, krijg ik een compilerfout: “Identifier verwacht”. Er is een kronkelende lijn onder “Case”. Om het even welke ideeën?

Is het ook verkeerd om in dit geval een GoTo-statement te gebruiken? Het lijkt erop dat ik het op een andere manier zou moeten herschrijven.


Ik heb mijn code als volgt gewijzigd:

If otherFactor AndAlso parameter = "mvrType" Then 
    'does something here 
Else 
    ' My original "Select Case statement" here without the case for "mvrType" 
End If

Antwoord 1, autoriteit 100%

Er is geen equivalent in vb.net dat ik kon vinden. Voor dit stuk code wil je het waarschijnlijk openen in reflector en het uitvoertype wijzigen op VB om de exacte kopie van de code die je nodig hebt te krijgen. Bijvoorbeeld wanneer ik het volgende in de reflector legt:

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;
}

Het gaf me de volgende VB.NET-uitgang.

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")

Zoals u kunt zien, kunt u dezelfde schakelkastverklaring bereiken met IF-verklaringen. Meestal raad ik dit niet aan omdat het het moeilijker is om te begrijpen, maar vb.net lijkt niet dezelfde functionaliteit te ondersteunen en het gebruik van reflector kan de beste manier zijn om de code te krijgen die je nodig hebt om het te krijgen veel pijn.

update:

Zojuist bevestigd dat je niet exact hetzelfde kunt doen in VB.NET, maar het ondersteunt wel een aantal andere nuttige dingen. Het lijkt erop dat de conversie van de IF-instructie de beste keuze is, of misschien wat refactoring. Hier is de definitie voor Select…Case

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


Antwoord 2, autoriteit 91%

Waarom doe je het niet gewoon zo:

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

Ik weet niet zeker of het hebben van een andere zaak aan het einde een groot probleem is of niet, maar het lijkt erop dat je niet echt hoeft te gaan als je het gewoon in de else-instructie van je if plaatst.


Antwoord 3, autoriteit 75%

Waarom wijzig je de standaardcase niet gewoon als een methode en roep je deze vanaf beide plaatsen aan?
Dit zou beter leesbaar moeten zijn en u kunt de code later op een efficiëntere manier wijzigen.


Antwoord 4, autoriteit 38%

In VB.NET kunt u meerdere voorwaarden toepassen, zelfs als de andere voorwaarden niet van toepassing zijn op de parameter Select. Zie hieronder:

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

Antwoord 5, autoriteit 31%

Ik weet niet zeker of het een goed idee is om een GoTo te gebruiken, maar als je het toch wilt gebruiken, kun je zoiets als dit doen:

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

Zoals ik al zei, hoewel het werkt, is GoTo geen goede gewoonte, dus hier zijn enkele alternatieve oplossingen:

Andersif gebruiken…

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

Een booleaanse waarde gebruiken…

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

In plaats van een booleaanse variabele in te stellen, kunt u in beide gevallen ook een methode rechtstreeks aanroepen…


Antwoord 6, autoriteit 19%

u moet eerst het label declareren
gebruik dit:

   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

Antwoord 7, autoriteit 12%

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

Antwoord 8

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

Antwoord 9

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

Is er een reden voor de goto? Als het niet aan het if-criterium voldoet, zal het de functie gewoon niet uitvoeren en naar het volgende geval gaan.


Antwoord 10

Er is een manier die nu tenminste werkt in Visual Basic 2017. Het is echter niet de mooiste.

GoTo Case "[label]"en Goto [Case-label]werken nog steeds niet.

Het label (Number2hier) moet achter de Casestaan. Dat was het meest teleurstellende deel.

dim Value = "1"
Select Case Value
    Case "0"
       ' do nothing, example
    Case "1"
        MsgBox("one")
        GoTo Number2
    Case "2"
Number2:
        MsgBox("two")
    Case "boolean"
        MsgBox("three")
        ' just to show it won't fall through
End Select

Other episodes