2009-05-04 8 views
24

Estoy escribiendo un código en VB.NET que utiliza una instrucción de cambio pero en uno de los casos necesita saltar a otro bloque. En C# que se vería así:Declaración de cambio de VB.NET Vaya a la caja

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; 
} 

Sin embargo, no sé cómo convertir esto a VB.NET. He intentado esto:

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  

Pero cuando hago esto me sale un error de compilación: "Se esperaba un identificador". Hay una línea ondulada debajo de "Caso". ¿Algunas ideas?

Además, ¿es incorrecto utilizar una declaración de GoTo en este caso? Parece que de alguna otra forma tendría que volver a escribirlo.


me han cambiado mi código de la siguiente manera:

If otherFactor AndAlso parameter = "mvrType" Then 
    'does something here 
Else 
    ' My original "Select Case statement" here without the case for "mvrType" 
End If 

Respuesta

13

No hay un equivalente en VB.NET que he podido encontrar. Para este fragmento de código, probablemente quiera abrirlo en Reflector y cambiar el tipo de salida a VB para obtener la copia exacta del código que necesita. Por ejemplo, cuando puse lo siguiente en 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; 
} 

me dio la siguiente salida de 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") 

Como puede ver, puede llevar a cabo la misma declaración de cambio de caja con declaraciones If. Por lo general, no recomiendo esto porque hace que sea más difícil de entender, pero VB.NET no parece ser compatible con la misma funcionalidad, y usar Reflector podría ser la mejor manera de obtener el código que necesita para que funcione sin una. Mucho dolor.

Actualización:

acaba de confirmar que no puede hacer exactamente lo mismo en VB.NET, pero apoya algunas otras cosas útiles. Parece que la conversión de la declaración IF es la mejor opción, o tal vez una refactorización. Esta es la definición para seleccionar ... Caso

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

+0

Muy interesante. ¿Cuál es el beneficio de usar declaraciones Select? Pensé que se utilizó una tabla de búsqueda. De cualquier forma, esto es lo que sospechaba (que VB.NET no lo soportaba) – KTF

+0

No una instrucción select o una declaración switch es solo compilación "mágica" en .NET, en realidad transforma todo en una gran dificultad para leer si- declaración else –

+4

No siempre es cierto (sé que este comentario es bastante antiguo, ¡pero es nuevo para mí!) - http://blogs.msdn.com/abhinaba/archive/2006/12/13/why-can-we-only-use -constants-in-a-switch-case-statement.aspx – Ant

4

No estoy seguro de que es una buena idea usar un GoTo pero si desea utilizarlo, puede hacer algo como esto:

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 

Como ya he dicho, aunque funciona, Goto no es una buena práctica, así que aquí están algunas soluciones alternativas:

Usando 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 

uso de un valor booleano ...

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 

En lugar de establecer una variable booleana también se puede llamar a un método directamente en ambos casos ...

+0

Te está faltando el punto específico del conmutador GoTo, no funciona como un GoTo, solo un salto de procedimiento a otro caso. –

+0

Sí, de lo que Nick Berardi está hablando es exactamente lo que necesito. ¿Hay algo así en VB.NET? – KTF

+0

Así es como funcionaría el GoTo en VB.NET – jgallant

19

¿Por qué no simplemente hacerlo así?

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 

No estoy seguro si no tener otro caso al final es una gran d eal o no, pero parece que no necesitas ir si solo lo pones en la declaración else de tu if.

+0

Además, el artículo siguiente explica las críticas a la declaración goto. http://en.wikipedia.org/wiki/GOTO#Criticism_of_goto_usage – ryanulit

+0

Esto significa que tendría que escribir el código de procesamiento dos veces; primero para el caso "Else" en la declaración If, y segundo para la declaración "Case Else" en la declaración "Select". Tendría que actualizar ambos, y en realidad son bastantes líneas de código. Parece una muy mala idea. – KTF

+0

Es una mala idea tener tanto código duplicado, una mala idea para usar goto, y una mala idea tener tanto código (como lo implican sus comentarios) en una estructura SWITCH. Extraiga el método (el código duplicado) en una función; También considere reemplazar el polimorfismo por herencia. –

2

debe declarar etiqueta primero uso esto:

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 
+0

El mismo problema que Meta-Knight, no desea utilizar declaraciones reales de GoTo. Un GoTo en la declaración a CASE es un salto de procedimiento a otro caso, no un salto de línea como lo ha hecho anteriormente. –

+2

wow, ¿por qué downvote? funciona, solo pruébalo :) – Sadegh

+0

@Nick solo inténtalo amigo – Sadegh

11

¿Por qué no acaba de refactorizar el caso por defecto como método y lo llaman desde ambos lugares? Esto debería ser más legible y le permitirá cambiar el código posteriormente de una manera más eficiente.

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

En VB.NET, puede aplicar varias condiciones incluso si las otras condiciones no se aplican al parámetro Seleccionar. Ver más abajo:

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

-1 'goto case default' (o' goto case else') es un error de sintaxis para mí. –

-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 

¿Hay alguna razón para el Goto? Si no cumple con el criterio if, simplemente no realizará la función y pasará al siguiente caso.

Cuestiones relacionadas