Instruction GoTo d'instruction de commutateur VB.NET
-
03-07-2019 - |
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
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
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.