2009-05-04 330 views
24

我正在VB.NET中編寫一些使用switch語句的代碼,但在其中一種情況下需要跳轉到另一個塊。在C#中它看起來像這樣:VB.NET Switch Statement GoTo案例

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 

回答

13

有一個在VB.NET沒有等價,我能找到。對於這段代碼,您可能要在Reflector中打開它,並將輸出類型更改爲VB以獲取所需代碼的確切副本。例如,當我把以下內容添加到反射器:

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語句轉換是你最好的選擇,或者可能是一些重構。下面是定義選擇...案例

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

4

我不知道它是使用轉到一個好主意,但如果你想使用它,你可以這樣做這樣的:

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 

而不是設置一個布爾變量,你也可以調用在兩種情況下,直接的方法......

+0

您錯過了開關機箱特定GoTo的要點,它不像GoTo那樣工作,只是程序跳轉到另一個案例。 – 2009-05-04 13:38:27

+0

是的,Nick Berardi在談論什麼,正是我需要的。在VB.NET中是否有類似的東西? – KTF 2009-05-04 13:40:42

+0

這就是GoTo在VB.NET下的工作方式 – jgallant 2009-05-04 13:43:49

19

爲什麼不只是這樣做:

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 

我不知道如果沒有其他情況在最後是一個大d不管是不是eal,但是如果你只是把它放在你的if語句的else語句中,你似乎並不需要這樣做。

+0

另外,下面的文章解釋了對goto語句的批評。 http://en.wikipedia.org/wiki/GOTO#Criticism_of_goto_usage – ryanulit 2009-05-04 13:48:18

2

應聲明標籤的前 使用本:

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 
11

你爲什麼不只是重構默認情況下,作爲一種方法,並從兩地稱呼呢? 這應該更具可讀性,並允許您以更高效的方式更改代碼。

1
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 
3

在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 
-1
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 
-1
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標準,它將不會執行該功能並轉到下一個案例。