Заявление о переключении VB.NET GoTo Case - PullRequest
27 голосов
/ 04 мая 2009

Я пишу некоторый код в VB.NET, который использует оператор switch, но в одном из случаев ему нужно перейти к другому блоку. В C # это будет выглядеть так:

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

Однако я не знаю, как преобразовать это в VB.NET. Я попробовал это:

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     

Но когда я делаю это, я получаю ошибку компилятора: «Ожидается идентификатор». Под "Case" есть волнистая линия. Есть идеи?

Кроме того, в этом случае неправильно использовать оператор GoTo? Кажется, я мог бы переписать это иначе.


Я изменил свой код следующим образом:

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

Ответы [ 9 ]

21 голосов
/ 04 мая 2009

Почему бы просто не сделать это так:

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

Я не уверен, если не иметь дела в конце, это большое дело или нет, но кажется, что вам не нужен переход, если вы просто поместите его в выражение else вашего if.

15 голосов
/ 04 мая 2009

В VB.NET нет эквивалента, который я мог бы найти. Для этого фрагмента кода вы, вероятно, захотите открыть его в Reflector и изменить тип вывода на VB, чтобы получить точную копию кода, который вам нужен. Например, когда я добавляю в 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;
}

это дало мне следующий вывод VB.NET.

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

Как вы можете видеть, вы можете выполнить ту же инструкцию переключения регистра с помощью операторов If. Обычно я не рекомендую это, потому что это усложняет понимание, но VB.NET, кажется, не поддерживает ту же функциональность, и использование Reflector может быть лучшим способом получить код, необходимый для его работы без много боли.

Обновление:

Только что подтвердил, что вы не можете делать то же самое в VB.NET, но он поддерживает некоторые другие полезные вещи. Похоже, конверсия оператора IF - это ваша лучшая ставка, или, может быть, какой-то рефакторинг. Вот определение для Select ... Case

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

11 голосов
/ 04 мая 2009

Почему бы вам просто не сделать рефакторинг случая по умолчанию как метода и вызвать его из обоих мест? Это должно быть более читабельным и позволит позже более эффективно изменять код.

4 голосов
/ 04 мая 2009

Я не уверен, что это хорошая идея - использовать GoTo, но если вы действительно хотите использовать его, вы можете сделать что-то вроде этого:

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

Как я уже сказал, хотя это работает, GoTo не является хорошей практикой, поэтому вот несколько альтернативных решений:

Использование 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

Использование логического значения ...

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

Вместо установки логической переменной вы также можете вызывать метод напрямую в обоих случаях ...

3 голосов
/ 26 июня 2012

В VB.NET вы можете применять несколько условий, даже если другие условия не применяются к параметру Select. Смотрите ниже:

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
2 голосов
/ 04 мая 2009

Вы должны сначала объявить этикетку используйте это:

    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
1 голос
/ 17 сентября 2009
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
0 голосов
/ 13 августа 2015
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

Есть ли причина для перехода? Если он не соответствует критерию if, он просто не будет выполнять функцию и перейдет к следующему случаю.

0 голосов
/ 29 августа 2012
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
...