28

私はswitchステートメントを使用するVB.NETでいくつかのコードを書いていますが、ある場合には別のブロックにジャンプする必要があります。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
4

10 に答える 10

23

このようにしないのはなぜですか:

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のelseステートメントに入れるだけなら、go toは本当に必要ないようです。

于 2009-05-04T13:42:16.087 に答える
16

私が見つけた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 は同じ機能をサポートしていないようです。たくさんの痛み。

アップデート:

VB.NET でまったく同じことを実行できないことを確認しましたが、他にもいくつかの便利なことをサポートしています。IF ステートメントの変換が最善の策、またはリファクタリングのようです。Select...Case の定義は次のとおりです。

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

于 2009-05-04T13:46:37.043 に答える
12

デフォルトのケースをメソッドとしてリファクタリングし、両方の場所から呼び出してみませんか? これにより読みやすくなり、後でコードをより効率的に変更できるようになります。

于 2009-05-04T14:02:58.843 に答える
7

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
于 2012-06-26T19:49:19.003 に答える
5

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

どちらの場合も、ブール変数を設定する代わりに、メソッドを直接呼び出すこともできます...

于 2009-05-04T13:35:26.803 に答える
3

最初にこれを使用してラベルを宣言する必要があります:

    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
于 2009-05-04T13:45:28.713 に答える
2
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
于 2009-09-17T03:19:26.007 に答える
0
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
于 2012-08-29T09:39:29.193 に答える
0
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 基準を満たさない場合は、関数を実行せずに次のケースに進みます。

于 2015-08-13T02:22:52.113 に答える
0

少なくとも Visual Basic 2017 では機能する方法があります。

GoTo Case "[label]"それでも機能しGoto [Case-label]ません。

ラベル (Number2ここ) はCase. それが最も残念な部分でした。

dim Value = "1"
Select Case Value
    Case "0"
       ' do nothing, example
    Case "1"
        MsgBox("one")
        GoTo Number2
    Case "2"
Number2:
        MsgBox("two")
    Case "boolean"
        MsgBox("three")
        ' just to show it won't fall through
End Select
于 2021-07-21T18:35:46.640 に答える