Заявление о выпуске VB.NET GoTo Case
Я пишу код в VB.NET, который использует оператор switch, но в одном из случаев ему нужно перейти в другой блок. В С# это будет выглядеть так:
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
Но когда я это делаю, я получаю ошибку компилятора: "Идентификатор ожидается". В "Кейсе" есть короткая строка. Есть идеи?
Кроме того, неправильно ли использовать инструкцию GoTo в этом случае? Кажется, я по-другому переписываю его.
Я изменил свой код следующим образом:
If otherFactor AndAlso parameter = "mvrType" Then
'does something here
Else
' My original "Select Case statement" here without the case for "mvrType"
End If
Ответы
Ответ 1
В 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")
Как вы можете видеть, вы можете выполнить тот же оператор case case с операторами If. Обычно я не рекомендую это, потому что это затрудняет понимание, но VB.NET, похоже, не поддерживает одну и ту же функциональность, и использование Reflector может быть лучшим способом получить код, необходимый для его работы с много боли.
Update:
Просто подтвердил, что вы не можете делать то же самое в VB.NET, но он поддерживает некоторые другие полезные вещи. Похоже, что преобразование оператора IF - ваш лучший выбор или, может быть, рефакторинг. Вот определение для Select... Case
http://msdn.microsoft.com/en-us/library/cy37t14y.aspx
Ответ 2
Почему бы просто не сделать это так:
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.
Ответ 3
Почему бы вам просто не реорганизовать случай по умолчанию как метод и вызвать его из обоих мест?
Это должно быть более читаемым и позволит вам более быстро изменить код.
Ответ 4
Я не уверен, что неплохо использовать 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
Вместо установки логической переменной вы также можете вызвать метод непосредственно в обоих случаях...
Ответ 5
В 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
Ответ 6
вы должны сначала объявить ярлык
используйте это:
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
Ответ 7
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
Ответ 8
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
Ответ 9
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
Есть ли причина для goto? Если он не соответствует критерию if, он просто не выполнит функцию и перейдет к следующему случаю.