2009-03-31 14 views
5

He estado trabajando sobre todo con VB.Net durante más de un año y acabo de dar cuenta de esteVB error de código inalcanzable/advertencia

¿Voy loco, o hace VB.Net NO tener un "código inalcanzable" ¿advertencia?

La siguiente compilación es muy feliz con nary una advertencia o error, a pesar de que hay una devolución entre las dos llamadas writeline.

Sub Main() 
    Console.WriteLine("Hello World") 
    Return 
    Console.WriteLine("Unreachable code, will never run") 
End Sub 

¿Falta algo? ¿Hay alguna forma de activar esto que no puedo encontrar?

Si no, ¿hay una buena razón para su omisión? (es decir, o estoy en lo cierto al pensar que esta es una situación lamentable)

Perdona el aire de diatriba sobre esta pregunta, no es una diatriba, me gustaría una respuesta.

Gracias


he criado en este MS Connect, como el bug # 428529

actualización

recibí el siguiente desde el director del programa de VB Equipos

Gracias por tomarse el tiempo para informar este problema. El compilador tiene soporte limitado para este escenario, y como usted señala que no tenemos advertencias para código inalcanzable. Hay algunos escenarios que nuestro algoritmo de análisis de flujo de Cómo maneja, como el siguientes:

Sub Main() 
    Dim x As Integer 
    Return 
    x = 4 
End Sub 

En este caso obtendrá una advertencia de que x Nunca se le ha asignado. Para el caso que mencionó, sin embargo, tendremos para ver cómo implementarlo para una futura versión .

+2

(llama) está utilizando VB por lo que el compilador se burla de usted (/ llama) lo siento. –

+0

Ian, si pudiera votar por un comentario :) –

Respuesta

4

Supongo que es un descuido en el compilador. El control de flujo es un problema muy difícil de corregir en cualquier idioma, pero especialmente en un lenguaje como VB que tiene tantos mecanismos de control de flujo diferentes. Por ejemplo,

  • excepciones
  • Goto
  • On Error (Reanudar, Goto, etc ...)
  • Salir llama

Si usted se siente fuertemente sobre este tema, por favor, file a bug on Connect.Nos tomamos muy en serio los errores presentados a través de Connect y hacemos nuestro mejor esfuerzo para solucionar el mayor número posible.

+0

Sé lo que dices, pero. . . C# tiene goto, permite retornos en el medio de las funciones, tiene bloques try/finally. . . Y aún puede detectar el código inalcanzable. He abierto un error, gracias por el enlace –

+0

@Binary, pero el uso del flujo de control de VB es ** mucho ** menos restrictivo que C#. Gran parte de esto se retiene desde VB6 días, pero estos artefactos hacen que sea significativamente más difícil realizar un análisis de flujo de código adecuado. ¿Puedes publicar el número de error de conexión aquí, por favor? – JaredPar

+0

Jared, cualquiera que todavía esté usando Goto, Por error, etc. merece lo que recibe. Ejecutamos todo con Option Strict On y esperamos "más" :) El número de error es 428529. Gracias amigo –

0

AFAIK, tiene razón en que VB.NET no le da una advertencia. C# hace sin embargo.

1

me gustaría para hacer frente a la respuesta de Jared.

La mayoría de los problemas que presenta no son problemáticos para el análisis de flujo de datos.

La única excepción es "Error/reanudar". Desordenan el análisis del flujo de datos bastante mal.

Sin embargo, es un problema bastante simple para mitigar:

Si más de un "On Error" instrucción se utiliza en un método, o el "Resume Next" se utiliza declaración, sólo se puede desactivar el flujo de datos análisis e informe una advertencia genérica. Una buena podría ser algo así como "En caso de error/reanudación están en desuso, use excepciones en su lugar". :)

En el caso común de una sola declaración "En caso de error" y sin una declaración de "reanudación", puede realizar un análisis de flujo de datos normal y obtener resultados razonables.

El gran problema es la forma en que se implementa el código DFA existente. No usa un diagrama de flujo de control, por lo que cambiarlo termina siendo realmente costoso. Creo que si desea abordar este tipo de problemas, realmente necesita extraer el código existente de DFA y reemplazarlo por algo que use un flujograma de control.