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
しかし、これを行うと、コンパイラーエラー「Identifier expected」が表示されます。 「ケース」の下に波線があります。何か案は?
また、この場合に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は同じ機能をサポートしていないようです。たくさんの痛み。
更新:
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