Question

J'écris dans VB.NET du code 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 lorsque je le fais, une erreur de compilation s’affiche: "Identificateur attendu". Une ligne sinueuse se trouve sous "Affaire". Des idées?

De plus, est-il erroné d'utiliser une instruction GoTo dans ce cas? Il me semble que je n'aurais pas à 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
Était-ce utile?

La solution

Il n’ya pas d’équivalent dans VB.NET que je puisse trouver. Pour ce morceau de code, vous allez probablement vouloir 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 ce qui suit 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<*> As String = args(0)
If (Not CS$4<*> Is Nothing) Then
    If (CS$4<*> = "UserID") Then
        Console.Write("UserID")
        Return
    End If
    If (CS$4<*> = "PackageID") Then
        Console.Write("PackageID")
        Return
    End If
    If ((CS$4<*> = "MVRType") AndAlso (args(1) = "None")) Then
        Console.Write("None")
        Return
    End If
End If
Console.Write("Default")

Comme vous pouvez le constater, vous pouvez réaliser la même déclaration de cas de commutation avec les instructions If. En général, je ne le recommande pas, car cela rend la compréhension plus difficile, mais VB.NET ne semble pas prendre en charge les mêmes fonctionnalités, et utiliser Reflector est peut-être le meilleur moyen d'obtenir le code dont vous avez besoin pour le faire fonctionner. beaucoup de douleur.

Mise à jour:

Vient de confirmer que vous ne pouvez pas faire exactement la même chose dans VB.NET, mais cela prend en charge d'autres choses utiles. On dirait que la conversion des relevés 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

Autres conseils

Pourquoi ne pas simplement le faire comme ceci:

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 le fait de ne pas avoir d’affaire à la fin est un gros problème ou non, mais il semble que vous n’ayez pas vraiment besoin de l’aller à si vous le mettez simplement dans la déclaration else de votre if.

Pourquoi ne pas simplement refactoriser le cas par défaut en tant que méthode et l'appeler depuis les deux endroits? Cela devrait être plus lisible et vous permettra de changer le code plus tard de manière plus efficace.

Je ne suis pas sûr que ce soit une bonne idée d'utiliser un GoTo, mais si vous souhaitez 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 ...

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

vous devez d'abord déclarer l'étiquette utilisez 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
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

Y at-il une raison pour le goto? S'il ne remplit pas le critère if, il n'effectuera tout simplement pas la fonction et ne passera pas au cas suivant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top