web-dev-qa-db-fra.com

Déclaration de commutateur VB.NET GoTo Case

J'écris du code dans VB.NET qui utilise une instruction switch mais dans l'un des cas, il doit passer à un autre bloc. En C #, cela ressemblerait à ceci:

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

Cependant, je ne sais pas comment convertir cela en VB.NET. J'ai essayé ceci:

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     

Mais quand je fais cela, j'obtiens une erreur de compilation: "Identifiant attendu". Il y a une ligne ondulée sous "Case". Des idées?

En outre, est-ce mal d'utiliser une instruction GoTo dans ce cas? Il me semble que je devrais le réécrire autrement.


J'ai changé mon code comme suit:

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

Il n'y a aucun équivalent dans VB.NET que j'ai pu trouver. Pour ce morceau de code, vous voudrez probablement l'ouvrir dans Reflector et changer le type de sortie en VB pour obtenir la copie exacte du code dont vous avez besoin. Par exemple, lorsque je mets le suivant dans Reflector:

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

cela m'a donné la sortie VB.NET suivante.

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

Comme vous pouvez le voir, vous pouvez exécuter la même instruction switch case avec les instructions If. Habituellement, je ne recommande pas cela, car il est plus difficile à comprendre, mais VB.NET ne semble pas prendre en charge les mêmes fonctionnalités, et l'utilisation de Reflector peut être le meilleur moyen d'obtenir le code dont vous avez besoin pour le faire fonctionner avec un beaucoup de douleur.

Mise à jour:

Je viens de confirmer que vous ne pouvez pas faire exactement la même chose dans VB.NET, mais il prend en charge d'autres choses utiles. On dirait que la conversion de l'instruction IF est votre meilleur pari, ou peut-être une refactorisation. Voici la définition de Select ... Case

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

15
Nick Berardi

Pourquoi ne pas faire comme ça:

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

Je ne sais pas si ne pas avoir d'autre cas à la fin est un gros problème ou non, mais il semble que vous n'ayez pas vraiment besoin d'aller si vous le mettez simplement dans la déclaration else de votre if.

21
ryanulit

Pourquoi ne refactorisez-vous pas simplement le cas par défaut comme méthode et appelez-le des deux endroits? Cela devrait être plus lisible et vous permettra de modifier le code plus tard de manière plus efficace.

11

Je ne suis pas sûr que ce soit une bonne idée d'utiliser un GoTo mais si vous voulez l'utiliser, vous pouvez faire quelque chose comme ceci:

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

Comme je l'ai dit, bien que cela fonctionne, GoTo n'est pas une bonne pratique, voici donc quelques solutions alternatives:

Utiliser 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

Utilisation d'une valeur booléenne ...

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

Au lieu de définir une variable booléenne, vous pouvez également appeler une méthode directement dans les deux cas ...

4
Meta-Knight

Dans VB.NET, vous pouvez appliquer plusieurs conditions même si les autres conditions ne s'appliquent pas au paramètre Select. Voir ci-dessous:

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
3
Zachafer

vous devez déclarer l'étiquette utiliser d'abord ceci:

    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
2
Sadegh
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
1
software