Frage

ich einige Code in VB.NET schreibe, die eine switch-Anweisung verwendet, aber in einem der Fälle muss es in einen anderen Block springen. In C # würde es so aussehen:

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

Aber ich weiß nicht, wie dies zu VB.NET konvertieren. Ich versuchte dies:

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     

Aber wenn ich dies tun, bekomme ich einen Compiler-Fehler: „Bezeichner erwartet“. Es gibt eine Wellenlinie unter „Fall“. Irgendwelche Ideen?

Auch ist es falsch, eine GoTo-Anweisung in diesem Fall zu benutzen? Es scheint keine andere Weise hätte ich es neu schreiben.


Ich habe meinen Code geändert wie folgt:

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

Lösung

Es gibt kein Äquivalent in VB.NET, die ich finden konnte. Für diesen Teil des Codes werden Sie wahrscheinlich in Reflector öffnen zu wollen, und den Ausgabetyp ändern, um die exakte Kopie des Codes zu erhalten, VB, die Sie benötigen. Zum Beispiel, wenn ich legte die folgend um Reflektor:

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

es gab mir die folgende VB.NET Ausgabe.

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

Wie Sie sehen können Sie die gleiche Schalter Case-Anweisung mit If-Anweisungen ausführen können. Normalerweise empfehle ich nicht, weil es es schwieriger zu verstehen macht, aber VB.NET scheint nicht die gleiche Funktionalität zu unterstützen, und Reflektor könnte der beste Weg, um den Code bekommen Sie müssen, um es mit sich als ein Arbeits Menge Schmerz.

Update:

Just bestätigt Sie können genau die gleiche Sache in VB.NET nicht tun, aber es hat einige andere nützliche Dinge zu unterstützen. Sieht aus wie die Aussage Umwandlung IF ist die beste Wahl, oder vielleicht einige Refactoring. Hier ist die Definition für Select ... Case

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

Andere Tipps

Warum nicht einfach tun es wie folgt aus:

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

Ich bin mir nicht sicher, ob nicht einen Fall sonst am Ende eine große Sache ist oder nicht, aber es scheint, wie Sie wirklich nicht, die gehen müssen, wenn Sie in der else-Anweisung Ihrer wenn nur ihn.

Warum Refactoring Sie nicht nur den Standard-Fall als Methode und es von beiden Orten nennen? Dies sollte besser lesbar sein und ermöglicht es Ihnen, den Code später in einer effizienteren Weise zu ändern.

Ich bin mir nicht sicher, ob es eine gute Idee, eine GoTo zu verwenden, aber wenn Sie es verwenden möchten, können Sie etwas tun:

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

Wie gesagt, obwohl es funktioniert, GoTo ist keine gute Praxis, so sind hier einige alternative Lösungen:

Mit 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

einen Booleschen Wert Mit ...

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

Statt eine boolean Variable Einstellung, die Sie auch eine Methode direkt in beiden Fällen nennen könnte ...

In VB.NET können Sie mehrere Bedingungen gelten auch dann, wenn die anderen Bedingungen gelten nicht für den Parameter auswählen. Siehe unten:

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

Sie sollten Etikett erklären zuerst verwenden diese:

    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

Gibt es einen Grund für den goto? Wenn es nicht das, wenn Kriterium nicht erfüllt, wird es einfach nicht die Funktion ausführen und zum nächsten Fall gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top