2011-01-03 4 views
5

Ich habe den Fehler gemacht = = zum Vergleichen von IP-Adressen anstelle der Verwendung der equals() -Methode der IPAddress-Klasse in C#, was stattdessen zum Vergleich von Referenzen führt von Werten. Da die Lösung, an der ich gerade arbeite, für ein Ein-Mann-Projekt (> 100.000 Zeilen Quellcode) sehr groß ist, bin ich mir sicher, dass ich noch einige dieser falschen Anweisungen in meinem Code habe.Alle Vorkommen des Vergleichs mit == in Visual Studio finden

Gibt es eine Möglichkeit, Visual Studio anzuweisen, alle Vorkommen von == Operationen für eine bestimmte Klasse für mich zu finden, damit ich die abgehörten Vergleiche finden und bereinigen kann?

mit freundlichen Grüßen, emi

+1

Nicht, dass ich weiß, aber verwenden Sie eine allgemeine Namenskonvention? I.e.'IPAddress ipAddress' oder' IPAddress ip1'? Sie könnten Wildcard oder Regex verwenden, um zu passen, wenn das der Fall ist. –

+1

Vielleicht ist es möglich, ein stylecop oder fxcop Plugin zu schreiben, das diese findet. – CodesInChaos

+0

Ich werde das versuchen, danke. :) – Emiswelt

Antwort

18

Es ist ein bisschen wie ein Hack, aber Sie können diese Klasse zu einem Projekt vorübergehend hinzu:

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

Compile und suchen Sie nach Warnungen über veraltete Methoden verwenden:

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

Sobald Sie festgelegt haben, die Code, entfernen Sie die Klassendefinition.

+1

+1 für Genie: Dies ist eine unglaublich einfache und effektive Lösung, die die beste Art ist. – Brian

+1

+1 und akzeptiert. Du bist erstaunlich. :). Ich habe eine Datei mit Ihrer Klasse in mein Projekt eingefügt und den Namespace in System.Net geändert. Ich konnte alle Vergleiche aufspüren, indem ich nach 'obselete' Compilerfehlern suchte. Danke vielmals! – Emiswelt

+2

Während ich darüber nachdachte, hat es ein Problem: es funktioniert nur, wenn Sie explizit eine Variable vom Typ 'IPAddress' deklariert haben, und nicht funktioniert, wenn eine Bibliothek eines Drittanbieters eine 'IPAddress' zurückgibt, ist es immer noch die echte . – CodesInChaos

3

Sie immer fündig verwenden könnte/ersetzen auf "==". Sie können die Filter verwenden, um festzulegen, wo Sie suchen möchten, oder einfach die gesamte Lösung verwenden.

+0

Mann, es ist eine sehr einfache Lösung, OP weiß das schon :-) –

+3

Ich dachte, dass - aber es war da raus. Man weiß nie. –

+1

Ich würde eher "alle Referenzen finden" verwenden, um nach Instanzen von "IPAddress" zu suchen. – Brian

1

Möglicherweise können Sie .NET Reflector oder das Visual Studio-Aufrufhierarchiefenster verwenden, um nach Aufrufen der operator == -Methode der IPAdress-Klasse zu suchen. Ich weiß nicht, ob das möglich ist, ich schmeiße nur eine Idee raus.

+0

Ich hätte das versucht, wenn ich genug Erfahrung mit dem .NET Reflektor hätte ... aber trotzdem danke. – Emiswelt

0

Wenn Sie den Namen der Variablen kennen, die die IP-Adresse über Ihrem Code darstellt, dann ist dies mit einigen Umgehungsmöglichkeiten möglich. Angenommen, Ihre Variable heißt 'ipAddress'. Dann tun Sie dies:

Platzhalter für die Suche verwenden:

ipAddress*== 

dann Schleife durch die Ergebnisse und ein Makro machen, die die Änderung für Sie. Zum Beispiel, nehmen wir an, Ihre Aussage wie folgt aussieht:

if (ipAddress == anotherIpAddress) { 

Dann sind Sie ein Mikro machen wie folgt:

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 

Jetzt haben Sie ein Makro, das die Linie für Sie ändern. Alles, was Sie tun müssen, ist wiederholt F4 und dann Strg^P zu drücken. Wenn Sie F4 drücken, gelangen Sie zu den nächsten Ergebnissen in Suchen in Dateien (ich nehme an, Sie verwenden dies), und wenn Sie Strg^P drücken, wird das Makro ausgeführt.

Es gibt eine bessere Lösung mit regulären Ausdrücken, aber ich bin mir nicht sicher, ob es mit Visual Studio funktioniert. Grundsätzlich gruppiert es Elemente in Suchen und verwendet sie in Ersetzen. Sie suchen also nach etwas wie "ipAddress == (< mein Variablenmuster>)" und ersetzen es durch "ipAddress.equals (\ 1)", das hier bezieht sich auf die erste Gruppe.

Hoffe, dass hilft!

+0

Danke, aber das Problem ist, es gibt viele verschiedene Variablennamen und viele verschiedene Muster wie networkInterfaceA.Addresses [0] == networkInterfaceB.Addresses [0]. – Emiswelt

0

Sie könnten die IP-Adresse ableiten und den Operator == überschreiben. Dies hängt natürlich davon ab, wie einfach Sie die Referenzen ersetzen können. Sobald Sie das getan haben, können Sie dort anhalten oder alle Instanzen Ihres == -Operators durch .Equals() ersetzen.

+0

Das ist eine nette Idee, ich denke, dass diese Idee in Kombination mit Marks Lösung sehr viel Potential bekommen würde. Dank. :) – Emiswelt

Verwandte Themen