我在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
但是,当我这样做时,我得到一个编译错误:“标识符预期”。 “案例”下有一条波浪线。有任何想法吗?
另外,在这种情况下使用GoTo语句是错误的吗?似乎任何其他方式我都要重写它。
我已将代码更改为:
If otherFactor AndAlso parameter = "mvrType" Then
'does something here
Else
' My original "Select Case statement" here without the case for "mvrType"
End If
我找不到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语句完成相同的switch case语句。通常我不推荐这个,因为它使得它更难理解,但VB.NET似乎不支持相同的功能,并且使用Reflector可能是获得所需代码的最佳方式很痛苦。
更新:
刚刚确认你不能在VB.NET中做同样的事情,但它确实支持其他一些有用的东西。看起来IF语句转换是您最好的选择,或者可能是一些重构。这是Select ... Case的定义
为什么不这样做:
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
我不确定是否在最后还没有其他情况是一个大问题,但是如果你只是把它放在if的else语句中,你似乎真的不需要去。
为什么不重构默认情况作为方法并从两个地方调用它?这应该更具可读性,并允许您以更有效的方式更改代码。
我不确定使用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
您可以在两种情况下直接调用方法,而不是设置布尔变量...
在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
你应该声明标签首先使用这个:
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
goto有原因吗?如果它不符合if标准,它将不执行该功能并转到下一个案例。