2011-01-03 10 views
5

Cometí el error de usar == para comparar direcciones IP en lugar de usar el método equals() de la clase IPAddress en C#, que resultará en la comparación de referencias en su lugar de valores Dado que la solución en la que estoy trabajando actualmente es muy grande para un proyecto de un solo hombre (> 100.000 líneas de código fuente), estoy muy seguro de que todavía tengo algunas de estas afirmaciones erróneas en mi código.encuentre todas las ocurrencias de comparación con == en visual studio

¿Hay alguna posibilidad de decirle a Visual Studio que encuentre todas las apariciones de == operaciones en una clase específica para mí, para que pueda encontrar y limpiar las comparaciones con errores?

con saludos cordiales, emi

+1

No es que yo sepa, pero ¿utiliza una convención de nomenclatura común? Es decir.'IPAddress ipAddress' o' IPAddress ip1'? Puede usar comodines o expresiones regulares para que coincidan si ese es el caso. –

+1

Quizás sea posible escribir un plugin de estilocop o fxcop para encontrarlos. – CodesInChaos

+0

Lo intentaré, gracias. :) – Emiswelt

Respuesta

18

Es un poco de un truco, pero se puede añadir temporalmente esta clase a su proyecto:

namespace System.Net 
{ 
    class IPAddress 
    { 
     [Obsolete] 
     public static bool operator ==(IPAddress a, IPAddress b) { return true; } 
     [Obsolete] 
     public static bool operator !=(IPAddress a, IPAddress b) { return true; } 
    } 
} 

Compilar y busque las advertencias sobre el uso de métodos obsoletos:

 
Warning 'IPAddress.operator ==(IPAddress, IPAddress)' is obsolete 

Una vez que haya fijado el código, elimine la definición de la clase.

+1

+1 por genio: esta es una solución increíblemente simple y efectiva, que es la mejor opción. – Brian

+1

+1 y aceptado. Eres fabuloso. :). Puse un archivo con su clase en mi proyecto y lo cambié a System.Net. Pude rastrear todas las comparaciones buscando los errores del compilador 'obselete'. ¡Muchas gracias! – Emiswelt

+2

Aunque también pensé en esto, tiene un problema: solo funciona si declaras explícitamente una variable de tipo 'IPAddress', y no funciona si una biblioteca de terceros devuelve una' IPAddress', pero seguirá siendo la real . – CodesInChaos

3

Siempre se puede utilizar una búsqueda/reemplazo en "==". Puede usar los filtros para determinar qué/dónde desea buscar o simplemente usar la Solución completa.

+0

amigo, es una solución muy simplista, OP lo sabe ya :-) –

+3

Me lo imaginé, pero lo estaba tirando por ahí. Nunca sabes. –

+1

Sería más apto para usar "buscar todas las referencias" para buscar instancias de 'IPAddress'. – Brian

1

Es posible que pueda utilizar .NET Reflector o tal vez la ventana de jerarquía de llamadas de Visual Studio para buscar llamadas al operador == método de la clase IPAdress. No sé si esto es posible, solo lanzando una idea.

+0

Hubiera intentado esto, si tuviera suficiente experiencia con el reflector .NET ... pero gracias de todos modos. – Emiswelt

0

Si conoce el nombre de la variable que representa la dirección IP sobre su código, entonces sí, es posible con alguna solución alternativa. Digamos que su variable se llama 'ipAddress'. A continuación, haga lo siguiente:

mediante la búsqueda de comodines:

ipAddress*== 

continuación recorrer los resultados y hacer una macro que hacer el cambio para usted. Por ejemplo, supongamos que su estado de cuenta es el siguiente:

if (ipAddress == anotherIpAddress) { 

luego de hacer un micro de la siguiente manera:

Start Recording 
Press Home    # This will go to the beginning of the line 
Ctrl+Right Three Times # This will keep the cursor on the beginning of anotherIpAddress 
Backspace    # This will remove the space 
.equals(    # This will write .equals(
Del Three Times   # This will delete the == and the space after it 
Ctrl+Right    # This will keep you at the closing bracket). 
)      # This will write another closing bracket for the equals functions. 
Stop Recording 

Ahora usted tiene una macro que cambie la línea para usted. Todo lo que tienes que hacer es presionar repetidamente F4 y luego Ctrl^P. Presionar F4 te lleva a los siguientes resultados en Buscar en archivos (supongo que usarás esto), y al presionar Ctrl^P ejecuta la macro.

Hay una mejor solución en realidad utilizando expresiones regulares, pero no estoy seguro de si funciona con Visual Studio. Básicamente, agrupa elementos en Buscar y los utiliza en Reemplazar. Entonces busca algo como "ipAddress == (< my variable pattern>)" y lo reemplaza con "ipAddress.equals (\ 1)", el que aquí se refiere al primer grupo.

Espero que ayude!

+0

Gracias, pero el problema es que hay muchos nombres de variables diferentes y muchos patrones diferentes, como networkInterfaceA.Addresses [0] == networkInterfaceB.Addresses [0]. – Emiswelt

0

Puede crear una subclase IPAddress y anular el operador ==. Esto, por supuesto, depende de cuán fácilmente puede reemplazar las referencias. Una vez que haya hecho eso, puede detenerse allí o reemplazar todas las instancias de su operador == con .Equals()

+0

Esta es una buena idea, creo que esta idea tendría mucho potencial cuando se combina con la solución de Mark. Gracias. :) – Emiswelt

Cuestiones relacionadas