Domanda

Sto scrivendo del codice in VB.NET che utilizza un'istruzione switch ma in uno dei casi deve passare a un altro blocco. In C # sarebbe simile a questo:

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

Tuttavia, non so come convertirlo in VB.NET. Ho provato questo:

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     

Ma quando lo faccio ottengo un errore del compilatore: " Identificatore previsto " ;. C'è una linea ondulata sotto "Caso". Qualche idea?

Inoltre, è sbagliato usare un'istruzione GoTo in questo caso? Sembra in qualsiasi altro modo che dovrei riscriverlo.


Ho modificato il mio codice come segue:

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

Soluzione

Non esiste un equivalente in VB.NET che ho trovato. Per questo pezzo di codice probabilmente vorrai aprirlo in Reflector e cambiare il tipo di output in VB per ottenere la copia esatta del codice che ti serve. Ad esempio, quando inserisco quanto segue in 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;
}

mi ha dato il seguente output VB.NET.

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

Come puoi vedere, puoi realizzare la stessa istruzione case switch con le istruzioni If. Di solito non lo consiglio perché rende più difficile la comprensione, ma VB.NET non sembra supportare la stessa funzionalità e l'utilizzo di Reflector potrebbe essere il modo migliore per ottenere il codice necessario per farlo funzionare senza molto dolore.

Aggiornamento:

Ho appena confermato che non puoi fare esattamente la stessa cosa in VB.NET, ma supporta alcune altre cose utili. Sembra che la conversione dell'istruzione IF sia la soluzione migliore o forse un refactoring. Ecco la definizione di Select ... Case

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

Altri suggerimenti

Perché non farlo in questo modo:

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

Non sono sicuro che non avere un altro caso alla fine sia un grosso problema o no, ma sembra che tu non abbia davvero bisogno di andare se lo metti semplicemente nell'istruzione else del tuo if.

Perché non rifatti semplicemente il caso predefinito come metodo e lo chiami da entrambi i punti? Questo dovrebbe essere più leggibile e ti permetterà di modificare il codice in un secondo momento in modo più efficiente.

Non sono sicuro che sia una buona idea usare un GoTo ma se vuoi usarlo, puoi fare qualcosa del genere:

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

Come ho detto, sebbene funzioni, GoTo non è una buona pratica, quindi ecco alcune soluzioni alternative:

Uso di 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

Utilizzo di un valore booleano ...

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

Invece di impostare una variabile booleana, puoi anche chiamare un metodo direttamente in entrambi i casi ...

In VB.NET, è possibile applicare più condizioni anche se le altre condizioni non si applicano al parametro Select. Vedi sotto:

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

dovresti prima dichiarare l'etichetta usa questo:

    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

C'è un motivo per andare al goto? Se non soddisfa il criterio if, semplicemente non eseguirà la funzione e passerà al caso successivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top