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
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
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.
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.
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 ...
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é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
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