Uzyskaj listę zerowych kodów referencyjnych w programie Visual Studio

139

W programie Visual Studio 2013 liczba odwołań do specjalnego kodu (metoda, właściwość, pole, ...) jest pokazywana przez Code Lens . Chcę uzyskać nieużywane (zerowe) kody w Visual Studio. Czy jest jakiś sposób, aby je zdobyć?

Mam na myśli poniższe odniesienie:

wprowadź opis obrazu tutaj

Nima Rostami
źródło
9
Myślę, że chce raczej listę wszystkich metod, do których nie ma odniesień, zamiast sprowadzić liczbę odwołań do tej konkretnej metody do zera.
Jurgen Camilleri
1
Jeśli nie chcesz, aby znaleźć nieużywane odniesienia, znajdziesz wiele zduplikowanych pytań. Po prostu wyszukaj w Google „c # znajdź nieużywany kod”
Panagiotis Kanavos
1
tak, chcę znaleźć wszystkie nieużywane kody zawierające metody, właściwości itp.
Nima Rostami
1
Pamiętaj, że nie możesz być pewien, że a publicjest nieużywany bez przeszukania całej bazy kodu. Jednak w przypadku nieużywanych pracowników wewnętrznych i szeregowych Analiza kodu wyświetli ostrzeżenie, jeśli masz włączone odpowiednie ostrzeżenie.
Matthew Watson
2
Po latach zrzut ekranu nadal wprowadza w błąd.
Sinjai

Odpowiedzi:

190

Prawdopodobnie najlepszym i najłatwiejszym sposobem osiągnięcia tego, czego szukasz, jest użycie wbudowanego narzędzia do analizy kodu w programie Visual Studio, aby znaleźć i zabrać Cię bezpośrednio do martwego kodu i nieużywanych elementów członkowskich.

W tym celu utworzyłem nowy plik zestawu reguł analizy kodu (poprzez Plik-> Nowy-> Plik , upewniając się, że wybrano Ogólne w lewym panelu i przewijając w dół, aby znaleźć Zestaw reguł analizy kodu , nadając mu nazwę pliku, a następnie wyszukując i wybierając poniższe zasady). Zobacz poniżej zawartość pliku zestawu reguł, który możesz skopiować i wkleić do nowego pliku z rozszerzeniem .ruleset do użycia.

Mając plik zestawu reguł, można kliknąć prawym przyciskiem myszy plik projektu w panelu Eksplorator rozwiązań i wybrać Właściwości . W oknach właściwości projektu kliknij kartę Analiza kodu w lewym panelu, a następnie kliknij Otwórz, aby przejść do lokalizacji pliku .ruleset. Jeśli przejdziesz do właściwości pliku rozwiązania (w przeciwieństwie do pliku projektu), możesz ustawić plik analizy kodu dla każdego projektu w rozwiązaniu w jednym miejscu (w obszarze Ustawienia analizy kodu i korzystając z menu rozwijanego, aby wybrać UWAGA: Musisz jednak wcześniej przejrzeć plik zestawu reguł, aby pojawił się on na liście rozwijanej w tym oknie właściwości).

Następnie wystarczy uruchomić analizę kodu w projekcie / rozwiązaniu (za pomocą opcji Analiza -> Uruchom analizę kodu na rozwiązaniu -LUB- Alt + F11 ) i wróci ona jako ostrzeżenia, wszelkie metody bez odwołań lub niewykorzystane elementy członkowskie, które znajdzie. Znajdzie nawet metody, do których odwołuje się metoda, która sama nie ma żadnych odniesień w innym miejscu.

Bądź jednak ostrożny, ponieważ jednym ze sposobów, w jaki analiza kodu pod kątem martwego kodu może kierować Cię w niewłaściwy sposób, jest to, że odniesienie jest „ukryte” przez wywołanie metody tylko przez delegatów i oczywiście przez odbicie.

W szczególności zasady wykrywania martwego kodu są następujące:

  • Metody prywatne, które nie są wywoływane z żadnego innego kodu (CA1811)
  • Nieużywane zmienne lokalne (CA1804)
  • Nieużywane pola prywatne (CA1823)
  • Nieużywane parametry (CA1801)
  • Klasy wewnętrzne, które nie są tworzone z żadnego innego kodu (CA1812).
  • Martwy kod w przełączniku bitowym lub ograniczonym (C6259)

Poniżej znajduje się zawartość pliku .ruleset, który można uzyskać, wykonując powyższe kroki, aby zachować zgodność. Możesz po prostu skopiować poniższy XML, wkleić go do Notatnika ++, zapisać gdzieś z rozszerzeniem .ruleset , przeglądać i używać jak wyjaśniono powyżej:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Dead Code Rules" Description=" " ToolsVersion="12.0">
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1801" Action="Warning" />
    <Rule Id="CA1804" Action="Warning" />
    <Rule Id="CA1811" Action="Warning" />
    <Rule Id="CA1812" Action="Warning" />
    <Rule Id="CA1823" Action="Warning" />
  </Rules>
  <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
    <Rule Id="C6259" Action="Warning" />
  </Rules>
</RuleSet>
Adam White
źródło
32
Nie sądzę, aby to w pełni odpowiadało na pytanie. Główną różnicą jest to, że CodeLens powie Ci, że metoda PUBLIC ma zerowe odwołania w całym rozwiązaniu. To jest klucz. FxCop, R # i twoja metoda na wszystko, co nie jest publiczne.
Scott Wylie
1
@ScottWylie - Nie zgadzam się. Właśnie wypróbowałem powyższe rozwiązanie i nie oznaczało ono publicznych metod, do których nie istnieją odniesienia. CodeLens był wyjątkowy w oznaczaniu martwego kodu, lokalnych elementów bez odwołań i nieużywanych zmiennych. Myślę, że dzięki temu większość ludzi uzyskuje dokładnie to, czego chcą, bez korzystania z narzędzia innej firmy.
mike
9
@mike Rozważ to: Jeśli chcesz znaleźć martwy kod za pomocą operacji masowej, zwykle nie przejmujesz się prywatnymi / chronionymi członkami, ponieważ są to problemy lokalne. Na przykład migruję projekt 500k + LoC z ponad 100 projektami i ponad 10 rozwiązaniami do architektury wzorców repozytorium. Po migracji komponentu muszę wiedzieć, które stare interfejsy mogę usunąć. Niektóre IDE, takie jak Eclipse, mają narzędzia do tego właśnie. Wyszarzone metody lokalne po prostu nie są moim zmartwieniem, chciałbym otrzymać listę klas / interfejsów PUBLIC, w których obiektyw kodu powiedziałby mi „0”.
Oliver Schimmer
4

Przejrzałbym każdy plik, wykonałem polecenie Ctrl-MO, aby zwinąć wszystko, a następnie przewijałem, szukając odniesienia 0.

user1730026
źródło
0

https://scottlilly.com/c-code-quality-improvement/remove-unused-classes-properties-and-functions/

„Niestety, [w programie Visual Studio Analysis] można wykryć tylko nieużywane prywatne elementy członkowskie. Dzieje się tak, ponieważ analizator kodu zakłada, że ​​członkowie publiczni mogą być używane przez inne programy. Może to być prawdą, jeśli publikujesz je jako API za pośrednictwem usługi sieciowej lub zwolnienie kodu jako biblioteki. ... ReSharper ma podobne funkcje analizy kodu - z korzyścią polegającą na sprawdzaniu nieużywanych publicznych członków. "

V Frenkel
źródło
-2

Oto ręczny sposób wykonania tego, którego użyłem do znalezienia nieużywanych klas, które są oznaczone jako publiczne.

  1. Wyszukaj i zamień wszystkie „publiczne zajęcia” na „prywatne zajęcia” dla jednego projektu w rozwiązaniu. Może być również konieczne zastąpienie „publicznej klasy statycznej” i / lub „publicznej klasy abstrakcyjnej”.
  2. Zbuduj, aby znaleźć wszystkie błędy
  3. Dla każdego błędu w kompilacji użyj kontroli źródła, aby przywrócić plik dla klasy, do której się odwołuje.
  4. Powtarzaj dla każdego błędu, aż kompilacja się powiedzie.
  5. Wszelkie pozostałe pliki, które nie zostały przywrócone, są prawdopodobnie kandydatami do usunięcia.
  6. (opcjonalnie) Zmień nazwy klas w powyższych plikach i wykonaj jeszcze jedną kompilację, aby znaleźć błędy.
  7. Zrób jeszcze raz Wyszukaj nazwę klasy, którą chcesz usunąć, aby upewnić się, że żadne jej wystąpienia nie są używane w odbiciach ani magicznych ciągach.
  8. Usuń zidentyfikowane nieużywane pliki klas.
  9. Powtórz te czynności dla każdego projektu rozwiązania, który chcesz wyczyścić.

Uwaga: jeśli nie zastosujesz się do reguły jednej klasy na plik, będzie to wymagało znacznie więcej pracy. Ponadto wszystkie punkty końcowe usługi API, które trzeba będzie sprawdzić, czy nie są używane przez żadne projekty zewnętrzne.

Ulfius
źródło
17
To wcale nie jest praktyczne.
Don Rolling
2
U mnie działa w dużym projekcie i jest jednym rozwiązaniem. Przypadki mogą się różnić, gdy jest to trudniejsze, ale chciałem zapewnić to jako możliwość.
Ulfius