Czy istnieje sposób na przejście do rzeczywistej implementacji metody za interfejsem?

182

W programie Visual Studio, klikając prawym przyciskiem myszy wywołanie metody, przechodzisz do implementacji tej metody w klasie, z wyjątkiem sytuacji, gdy uzyskujesz dostęp do tej metody przez interfejs: w takim przypadku przechodzisz do metody interfejsu, a nie do rzeczywistej implementacji.

Czy istnieje sposób / wskazówki (skrót klawiszowy lub cokolwiek), aby uzyskać dostęp do tej faktycznej implementacji? W przeciwnym razie utkniesz, aby dodać komentarz, aby pamiętać, gdzie go wdrożyłeś, co naprawdę nie jest produktywne i podatne na błędy!

Aktualizacja: ciekawe odpowiedzi, ale nie jestem do końca zadowolony, ponieważ wszystkie są uciążliwe. Podam dokładny przykład:

IInterface iInterface = someObject;                        
iInterface.someMethod();

W rzeczywistości, jeśli Visual Studio był trochę sprytny, aby spojrzeć tylko o jedną linię powyżej wywołania metody, zobaczyłby, gdzie jest prawdziwy obiekt. Pozwoliłoby mi to zaoszczędzić wiele naciśnięć klawiszy i uniknąć użycia polecenia „znajdź wszystkie referencje”, a następnie zeskanuj moje linie zmęczonymi oczami, aby zobaczyć, która linia zawiera właściwą :)

użytkownik310291
źródło
4
Skąd miałby wiedzieć, które wdrożenie chciałbyś zobaczyć? (Mogę wyświetlić hierarchię typów, aby znaleźć wszystkie znane implementacje, ale może to być funkcja ReSharper ... nie jestem pewien.)
Jon Skeet
1
@ superupat: Masz na myśli podczas debugowania?
Jon Skeet,
2
ReSharper implementuje go, dostarczając listę implementacji do wyboru, w których nie może wykryć konkretnej. Fajna funkcja i tęsknię za nią, ponieważ „Znajdź wszystkie referencje” zbyt wiele przywraca!
Fenton
4
Po raz pierwszy w życiu Jon Skeet mówi „nie jestem pewien”. dla pytania C # w SO.
Muthu Ganapathy Nathan
3
@MuthuGanapathyNathan Prawdopodobnie próbował choć raz wyglądać, jakby był człowiekiem.
Vort3x,

Odpowiedzi:

258

Wykonuję następujące czynności:

1) Kliknij metodę prawym przyciskiem myszy i kliknij „Wyświetl hierarchię połączeń” (lub skrót Ctrl + K, Ctrl + T)

2) Rozwiń folder „Implements x”, który wyświetli wszystkie implementacje tej metody. Kliknij jeden, aby tam przejść.

Stosunkowo szybki i łatwy. Irytujące wydaje się, że nie ma odpowiednika dla samego interfejsu.


aktualizacja : od wersji 1 programu Visual Studio 2015 kliknij prawym przyciskiem myszy metodę i wybierz opcję przejdź do implementacji. Możesz także zamapować go na skrót klawiaturowy za pomocą Narzędzia> Opcje> Środowisko> Klawiatura i wyszukaj polecenie Edit.GoToImplementation. Domyślny skrót to Ctrl+F12. ( F12przejdzie do interfejsu).


MajorRefactoring
źródło
Dobre obejście. Trzymam się tego, gdy nie mam Resharpera
Rzym.
5
Jestem w stanie pominąć krok 1. Po prostu „Wyświetl hierarchię połączeń” (lub skrót Ctrl + K, Ctrl + T) bezpośrednio z miejsca, w którym pracujesz i pomiń interfejs razem. Jestem w VS 2013.
Tony L.
Czy jest jakiś klawisz skrótu do realizacji? Próbowałem ALT-CTRL-F12 bez powodzenia. (Szczyt to ALT-F12)
Levi Fuller
47

W VS2013 można umieścić kursor nad metodą i użyć opcji Nawiguj do ... (CTRL +,), a wyświetli się wszystkie miejsca, w których zadeklarowano nazwę. Nie działa dobrze, jeśli różne interfejsy używają tych samych nazw metod.

Wraz z aktualizacją 1 VS2015 wprowadzono nowy skrót o nazwie „Przejdź do implementacji”.

Rolf Kristensen
źródło
4
Możesz użyć Alt + End, jeśli używasz resharper.
brechtvhb
1
Nie działało dla mnie. Używam VS Express 2013 dla sieci.
Akira Yamamoto,
Uważam to za najprostsze rozwiązanie, bez odrywania rąk od klawiatury. Dzięki Rolf
Jp Vinjamoori,
1
To najszybsze możliwe rozwiązanie.
mbudnik
@brechtvhb Możesz również ustawić Alt + End bez R #, dostosowując skrót klawiaturowy do polecenia Edit.NavigateTo:)
demoncodemonkey
17

Stworzyłem bezpłatne rozszerzenie dla Visual Studio 2010 i Visual Studio 2012 o nazwie Margines dziedziczenia, aby zapewnić tę konkretną funkcję, a także dać wyraźne wskazanie, kiedy metoda implementuje metodę interfejsu z powodu dopasowania podpisu. W bieżącej wersji możesz kliknąć dowolny glif prawym przyciskiem myszy, aby uzyskać menu elementów do nawigacji.

Margines dziedziczenia - Visual Studio Gallery

Zrzut ekranu
(źródło: microsoft.com )

Sam Harwell
źródło
3
Próba resharpera wygasła w pracy, wypróbowałem to rozszerzenie i to działa! dzięki koleś
Giorgio Minardi
15

Kliknij prawym przyciskiem myszy, a następnie „Znajdź wszystkie odniesienia”.

Spowoduje to wyświetlenie wiersza kodu dla wszystkich miejsc, w których stosowana jest metoda, w tym deklaracja interfejsu i implementacje metody interfejsu. Następnie możesz kliknąć linię, aby przejść do lokalizacji kodu.

Phil Carson
źródło
Nie daje to wdrożenia.
Robaticus,
1
@Robaticus faktycznie to robi. Nie jest to najwygodniejszy sposób, ale implementacje zostaną pomieszane ze wszystkimi innymi odniesieniami.
Rex M
To jedyna rzecz, którą teraz robię, ale przede wszystkim jest to męczące, ponieważ nie mam dobrych oczu :)
user310291
6
Alternatywą dla znajdowania symboli jest hierarchia połączeń. Ma metody pogrupowane w strukturze folderów: Połączenia z „...”, Połączenia z „...” i Implementacja „...”
Phil Carson
4
Skrót „Znajdź wszystkie odniesienia” to Shift + F12.
IsmailS,
8

W zależności od posiadanej wersji programu Visual Studio powiem warunkowo „tak”.

Obecnie działam na Ultimate i nie mam innych wersji, aby to sprawdzić. To powiedziawszy, w Ultimate możesz użyć Eksploratora architektury, aby znaleźć implementacje. Jest to trochę bardziej zaangażowane niż metoda kliknięcia prawym przyciskiem, ale oto jak to działa.

  • Idź do View->Architecture Explorer(lub CTRL-W, N)
  • Kliknij Widok klasy i znajdź przestrzeń nazw zawierającą interfejs na liście, która zostanie otwarta.
  • Po prawej stronie listy przestrzeni nazw znajduje się pionowy przycisk z napisem Types. Kliknij to
  • Wybierz Interfaces
  • Wybierz interfejs z listy
  • Po Membersprawej stronie pojawi się pionowy przycisk z napisem . Kliknij ten przycisk
  • Wybierz Implemented by(poniżej Inbound Navigation), a zobaczysz listę implementacji twojego interfejsu.
  • Dwukrotne kliknięcie implementacji przeniesie Cię na zajęcia.
Robaticus
źródło
Jestem całkiem pewien, że Architecture Explorer to tylko wersja Ultimate, ale to zadziała.
Richard
Dziękuję całkiem nieźle, ale w tym kontekście chcę szybko zmienić kod.
user310291
6

W Ultimate 2012 możesz przeszukiwać interfejs w eksploratorze rozwiązań. Kliknij interfejs prawym przyciskiem myszy i wybierz „Typy pochodne”, zaimplementowane klasy zostaną wyświetlone w eksploratorze rozwiązań. Nie jestem pewien, czy to działa w trybie ekspresowym.

Jack Liu Shurui
źródło
Nie zauważyłem tego. Dzięki. <br/> Teraz, jeśli istniał tylko sposób, aby eksplorator rozwiązań otworzył drzewo do aktualnie wyświetlanego pliku, więc nie muszę najpierw wyświetlać opisu edytora, aby uzyskać ścieżkę do pliku, aby uzyskać ścieżkę, a następnie nawigować za pomocą eksploratora rozwiązań do pliku źródłowego, w którym mogę ustalić listę wdrożonych przez interfejs ... Nawigacja po kodzie źródłowym powinna stać się ważniejszą funkcją.
George
- Właśnie odkryłem polecenie „Ctrl +], S”, które rozszerza drzewo eksploratora rozwiązań do bieżącego dokumentu edycji (synchronizacja z aktywnym dokumentem). Powstały węzeł pliku można następnie rozwinąć, aby odsłonić zawarte w nim typy, które z kolei można kliknąć prawym przyciskiem myszy, aby uzyskać dostęp do menu kontekstowego zawierającego polecenie „Typy pochodne”. Miły.
George
2
@George, możesz również Visual Studio ZAWSZE śledzić bieżący otwarty plik w eksploratorze rozwiązań za pomocą Narzędzia -> Opcje -> Projekty i rozwiązania -> Ogólne -> „Śledź aktywny element w eksploratorze rozwiązań”
MajorRefactoring
VS2012 Premium ma również tę funkcję. W VS2015 Enterprise ta funkcja „ Typy pochodne ” została podzielona na dwie funkcje „ Typy pochodne ” i „ Zaimplementowane przez ”, jeszcze ładniejsze :)
cateyes
6

W Visual Studio 2015 Update 1 (wydanej w grudniu 2015) dodano teraz funkcję „Przejdź do implementacji” jako standard.

PaulG
źródło
5

Dla osób korzystających z Resharpera naciśnięcie CTRL + F12 spowoduje przejście bezpośrednio do metody klasowej!

Maximc
źródło
4

To jest niemożliwe. To, co opisujesz, miałoby sens tylko wtedy, gdyby interfejs był ograniczony do 1 implementacji.

Rozważ ten przykład:

interface IWrite 
{ 
 void Write(); 
}
class A : IWrite { 
  public void Write() { Console.WriteLine("A"); } 
}
class B : IWrite { 
  public void Write() { Console.WriteLine("B"); } 
}
class X : IWrite { 
  private readonly string _x;
  public X(string x) {
    _x = x;
  } 
  public void Write() { Console.WriteLine(_x); } 
}

class UseIWrite()
{
  public void Use(IWrite iwrite) 
  {
     iwrite.Write();
  }
}

Jeśli użyjesz przejdź do implementacji zapisu w UseIWrite, nastąpi przejście do deklaracji interfejsu, ponieważ w tym momencie każda z implementacji IWrite może zostać przekazana do metody.

Na szczęście niektóre narzędzia, takie jak na przykład ReSharper, pozwalają znaleźć wszystkie zastosowania metody, dzięki czemu można łatwo przejść do żądanej implementacji.

m0sa
źródło
1
… A jeśli jest tylko jedna implementacja, R # zabierze Cię tam bez zbędnych ceregieli.
Jay
1
To nie jest darmowe, ale nie jest też Visual Studio. Ile wart jest twój czas? :)
Jim Arnold
3
To nie tak, że nie chcę płacić, to na zasadzie: jest to dość podstawowa funkcja zdrowego rozsądku,
szkoda
3
@ user310291 Chociaż zgadzam się z tobą, nie kupowanie produktu, który ma dokładnie taką funkcję, jaką chcesz, aby „ukarać” osobę trzecią za nieudostępnienie jej po wyjęciu z pudełka, odcina ci nos na przekór twarzy.
TarkaDaal
1
Resharper zapewnia to bez konieczności pokazywania wszystkich zastosowań. Możesz wybrać implementację, do której chcesz przejść.
Michael Joyce
4

Program Visual Studio z aktualizacją 1 implementuje teraz tę funkcję! Wystarczy kliknąć członka prawym przyciskiem myszy, a pod „Idź do definicji” powinieneś zobaczyć „Idź do implementacji”.

Jason Steele
źródło
2

Sprawdź to nowe bezpłatne rozszerzenie Visual Studio 2013 - Implementator . Dodaje opcję „Idź do implementacji” do menu kontekstowego edytora Visual Studio.

Nie jest tak niezawodny i szybki jak Resharper, ale dobrze sobie radzi.

Yura
źródło
2

Możesz spróbować Ctrl + F12skrótu. Doprowadzi cię do implementacji, tak jak poprowadzi Cię do metod nieinterfejsowych przy użyciu F12. [Próbowałem w VS 2017, nie jestem pewien co do innych wersji]

Akbar Badhusha
źródło
1
ten skrót działa dobrze w vscode z maszynopisem.
Zuhair Taha,
1

Visual Studio może tylko powiedzieć, gdzie jest odwołanie, ale może to być zbyt gruboziarniste.

Istnieją inne narzędzia, które mogą powiedzieć ci więcej o strukturze twojej aplikacji, w tym o tym, która klasa implementuje który interfejs, która metoda unieważnia inną metodę i tak dalej. Osobiście wolę używać Understand For C / C ++.

Patrick
źródło
1

Przejście do deklaracji otworzy metodę interfejsu. Przechodząc do implementacji, zabiorę Cię lub wyświetli listę klas, które implementują kod dla tej metody interfejsu (nie samej metody interfejsu).

Aktualizacja

Jak zauważył Jon Skeet w komentarzach (i brakowało mi przed odpowiedzią), funkcja, którą opisałem, może być funkcją ReSharper ... a nie Visual Studio.

Jamie Dixon
źródło
0

Nie. Nie jest to możliwe, pomimo skomplikowanej struktury kodu pamięci utrzymywanej przez VS, nawigacja kodu jest raczej ... skąpa.

Wydaje się, że jedyną alternatywą jest globalne wyszukiwanie z „Find All Reference”, a następnie ręczne wyszukiwanie wynikowej listy w celu wykluczenia deklaracji wartości wpisanych, konwersji itp. Lub użycie innych narzędzi w VS innych niż edytor kodu. Wszystko raczej złożone i rozczarowujące.

Jerzy
źródło