2010-04-27 32 views
8

Tôi là một C# /. Net/Visual Studio noob. Tôi thừa kế một ứng dụng C# đã hoàn thành một nửa cho một chiếc điện thoại di động. Trong quá trình gỡ lỗi, tôi đã xem qua một số lớp đã hoàn thành một nửa mà dường như không được sử dụng ở bất kỳ nơi nào khác trong mã. Có cách nào để xác định xem định nghĩa lớp có được khởi tạo ở bất kỳ đâu không?Tìm các lớp chưa sử dụng trong ứng dụng C#

Trả lời

14

Cách nhanh nhất (trong Visual Studio) là click chuột phải vào tên loại và chọn Tìm tất cả các tài liệu tham khảo từ trình đơn ngữ cảnh sẽ hiển thị cho bạn tất cả các địa điểm mà loại đó được tham chiếu trong giải pháp hiện tại

+0

+1 tìm tất cả các tham chiếu/Sử dụng nếu chúng ta dính vào Visual Studio –

+1

Nhấn SHIFT-F12 được cho là nhanh hơn. :) –

+2

Nếu một lớp A chỉ được tham chiếu từ một số lớp B không được sử dụng, lớp A cũng có thể được coi là không được sử dụng. – Vlad

3

Bạn sẽ nhận được Resharper - nó sẽ hiển thị mã "chết" màu xám và giúp việc tái cấu trúc dễ dàng hơn nhiều! Bạn cũng có thể thích CodeRush.

+0

Anh ấy nên sử dụng CodeRush ;-) – nubm

0

Bạn có thể liệt kê tất cả các lớp (tìm kiếm class [a-zA-Z0-9_]+), sau đó tìm kiếm new <classname>. Những cái không tìm thấy ở lần tìm kiếm thứ hai không được sử dụng. Tất nhiên, một kịch bản đơn giản trong ngôn ngữ kịch bản yêu thích của bạn sẽ giúp bạn.

Tuy nhiên, bạn sẽ cần phải lọc ra các lớp được sử dụng làm lớp cơ sở của các lớp đã sử dụng.

Lưu ý rằng theo cách này bạn sẽ không tìm thấy các lớp chỉ được sử dụng từ các lớp không sử dụng, do đó có thể cần một số lần lặp lại. Hơn nữa, nếu một số hai lớp đang sử dụng lẫn nhau (nhưng không được sử dụng từ bên ngoài), việc loại bỏ chúng có thể cần thêm nỗ lực.

Chỉnh sửa:
Cách tiếp cận tốt hơn là xây dựng cây phụ thuộc: cho mỗi lớp bạn xác định lớp nào được lớp đó sử dụng và lớp nào là lớp cơ sở cho lớp đó. Bằng cách này bạn sẽ tìm thấy các lớp nào được yêu cầu cho mỗi lớp đơn. Sau đó, bạn có thể xác định các lớp nào được yêu cầu (trực tiếp hoặc gián tiếp) từ lớp có chứa Main. Tất cả các lớp khác là "không thể truy cập" và do đó không được sử dụng.

Tuy nhiên, phương pháp này sẽ loại bỏ các lớp được khởi tạo bằng phản chiếu. Vâng, không có cách nào để tìm hiểu tại thời gian biên dịch, mà các lớp học sẽ được instantiated bởi sự phản ánh anyway.

Có thể sử dụng các công cụ sẵn sàng (như các công cụ khác được đề xuất) là một giải pháp thay thế đơn giản hơn.

2

Without ReSharper hoặc một công cụ tương tự, bạn luôn có thể thực hiện tìm kiếm tập tin cho "ClassName mới (" trong toàn bộ giải pháp.

+1

Nó sẽ không hoạt động cho các lớp tĩnh hoặc trừu tượng – Gregoire

+1

Hoặc các loại được khởi tạo qua Reflection. –

+0

@Erik: các giải pháp khác sẽ không hoạt động đối với các loại được khởi tạo thông qua phản chiếu. – Vlad

1

Tôi thường bắt đầu bằng Shift-F12 (hoặc nhấp chuột phải vào tên lớp và chọn "Tìm Tất cả Tài liệu tham khảo ")

0

Trừ khi bạn biết mã và mô-đun có thể sử dụng nó., CodeRush hoặc Resharper là lựa chọn tốt hơn của bạn.

Không có câu trả lời nào khác đề cập đến các công cụ sửa đổi có thể áp dụng cho các lớp/chức năng. Bạn chắc chắn muốn xem xét phạm vi trước khi xóa mã. Bạn có thể có các hội đồng khác sử dụng các lớp/chức năng.

0

Xóa chúng khỏi dự án và để thử nghiệm đơn vị của bạn (ahem, bạn có quyền đó?) Và nhóm QA của bạn (bạn có quyền đó không?) Xác định sự cố.

Truyện cười sang một bên, nếu nó rõ ràng là nó không hoàn chỉnh, tại sao không chỉ đơn giản là loại bỏ mã và biên dịch lại?

Các bước tiếp theo tôi sẽ thực hiện là sử dụng công cụ như "Tìm tất cả các tham chiếu" hoặc Resharper (thậm chí nó có tính năng để làm điều đó không?)

+0

Mã này được thừa kế từ một sinh viên thực tập sinh đại học. Nó không có bài kiểm tra đơn vị. Tôi sẽ thêm các bài kiểm tra đơn vị, nhưng trước khi tôi có thể làm điều đó tôi cần phải hiểu mã, điều này khá khó khăn khi có các lớp và các phương thức thậm chí không được sử dụng. Trong khi xem xét mã trước khi đăng ký, tôi đã dành một khoảng thời gian đáng kể để tìm ra cách thức hoạt động của phương thức dường như bị hỏng. Tôi không phải là một anh chàng C#, vì vậy tôi đã dành thời gian xem xét các tài liệu suy nghĩ điều gì đó ma thuật đã xảy ra, trong khi thực tế nó đã thực sự bị hỏng, và chỉ không được gọi từ bất cứ nơi nào: ( – limscoder

Các vấn đề liên quan