2011-01-03 13 views
5

Tôi đã nhầm lẫn khi sử dụng == để so sánh địa chỉ IP thay vì sử dụng phương thức equals() của lớp IPAddress trong C#, điều này sẽ dẫn đến so sánh tham chiếu thay thế giá trị. Vì giải pháp tôi hiện đang làm việc rất lớn cho một dự án một người (> 100.000 dòng mã nguồn), tôi rất chắc chắn rằng tôi vẫn còn một số câu lệnh sai trong mã của tôi.tìm tất cả các lần so sánh với == trong studio trực quan

Có khả năng nào để nói với Visual Studio để tìm tất cả các lần xuất hiện của các hoạt động == trên một lớp cụ thể cho tôi, để tôi có thể tìm và dọn dẹp các so sánh bị lỗi?

với lời chúc mừng tốt đẹp nhất, emi

+1

Không phải là tôi biết, nhưng bạn có sử dụng quy ước đặt tên chung không? I E.'IPAddress ipAddress' hoặc' IPAddress ip1'? Bạn có thể sử dụng ký tự đại diện hoặc regex để khớp nếu trường hợp đó xảy ra. –

+1

Có lẽ bạn có thể viết một plugin stylecop hoặc fxcop để tìm kiếm chúng. – CodesInChaos

+0

Tôi sẽ thử điều đó, cảm ơn bạn. :) – Emiswelt

Trả lời

18

Đó là một chút của một hack nhưng bạn có thể tạm thời thêm lớp này để dự án của bạn:

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 và tìm kiếm những cảnh báo về việc sử dụng phương pháp lỗi thời:

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

Một khi bạn đã cố định mã, loại bỏ định nghĩa lớp.

+1

+1 cho thiên tài: Đây là một giải pháp vô cùng đơn giản và hiệu quả, đó là loại tốt nhất. – Brian

+1

+1 và được chấp nhận. Bạn thật tuyệt. :). Tôi đặt một tập tin với lớp của bạn vào dự án của tôi và thay đổi không gian tên của nó thành System.Net. Tôi đã có thể theo dõi tất cả các so sánh bằng cách tìm kiếm lỗi trình biên dịch 'obselete'. Cảm ơn rất nhiều! – Emiswelt

+2

Trong khi tôi nghĩ về điều này, nó có vấn đề: nó chỉ hoạt động nếu bạn khai báo một biến rõ ràng kiểu 'IPAddress', và không hoạt động nếu thư viện của bên thứ ba trả về' IPAddress', nó sẽ vẫn là một thực . – CodesInChaos

3

Bạn luôn có thể sử dụng tìm/thay thế trên "==". Bạn có thể sử dụng các bộ lọc để xác định những gì/nơi bạn muốn tìm kiếm hoặc chỉ sử dụng toàn bộ giải pháp.

+0

dude nó là một giải pháp rất đơn giản, OP biết rằng đã :-) –

+3

Tôi figured rằng - nhưng đã ném nó ra khỏi đó. Bạn không bao giờ biết. –

+1

Tôi muốn sử dụng "tìm tất cả các tham chiếu" để tìm các phiên bản 'IPAddress'. – Brian

1

Bạn có thể sử dụng .NET Reflector hoặc có thể cửa sổ phân cấp cuộc gọi Visual Studio để tìm các cuộc gọi đến phương thức operator == của lớp IPAdress. Tôi không biết nếu điều này là có thể, chỉ cần ném ra một ý tưởng.

+0

Tôi đã thử điều này, nếu tôi có đủ kinh nghiệm với .NET Reflector ... nhưng cảm ơn. – Emiswelt

0

Nếu bạn biết tên của biến đại diện cho địa chỉ IP trên mã của bạn, thì có, có thể có một số cách giải quyết khác. Nói biến của bạn được gọi là 'ipAddress'. Sau đó thực hiện điều này:

Sử dụng ký tự đại diện tìm kiếm:

ipAddress*== 

Sau đó lặp qua các kết quả và thực hiện một macro thực hiện thay đổi cho bạn. Ví dụ, chúng ta hãy giả sử tuyên bố của bạn trông như thế này:

if (ipAddress == anotherIpAddress) { 

Sau đó, bạn thực hiện một vi như sau:

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 

Bây giờ bạn có một macro mà có sự thay đổi cho bạn. Tất cả bạn phải làm là để liên tục nhấn F4 sau đó Ctrl^P. Nhấn F4 sẽ đưa bạn đến kết quả kế tiếp trong Tìm trong tập tin (tôi cho rằng bạn sẽ sử dụng nó), và nhấn Ctrl^P thực thi macro.

Có một giải pháp tốt hơn thực sự sử dụng cụm từ thông dụng nhưng tôi không chắc liệu nó có hoạt động với studio trực quan hay không. Về cơ bản, nó nhóm các phần tử trong Tìm và sử dụng chúng trong Thay thế. Vì vậy, bạn tìm kiếm một cái gì đó như "ipAddress == (< mẫu biến của tôi>)" và thay thế bằng "ipAddress.equals (\ 1)", cái ở đây đề cập đến nhóm đầu tiên.

Hy vọng điều đó sẽ hữu ích!

+0

Cảm ơn, nhưng vấn đề là, có nhiều tên biến khác nhau và nhiều mẫu khác nhau như networkInterfaceA.Addresses [0] == networkInterfaceB.Addresses [0]. – Emiswelt

0

Bạn có thể phân lớp IPAddress và ghi đè toán tử ==. Điều này tất nhiên phụ thuộc vào cách dễ dàng bạn có thể thay thế các tài liệu tham khảo. Khi bạn đã thực hiện điều đó, bạn có thể dừng ở đó hoặc thay thế tất cả các trường hợp của toán tử == bằng .Equals()

+0

Đây là một ý tưởng hay, tôi nghĩ ý tưởng này sẽ có nhiều tiềm năng khi kết hợp với giải pháp của Mark. Cảm ơn. :) – Emiswelt