Gibt es eine Möglichkeit, zur tatsächlichen Implementierung der Methode hinter einer Schnittstelle zu navigieren?

180

Wenn Sie in Visual Studio mit der rechten Maustaste auf einen Methodenaufruf klicken, gelangen Sie zur Implementierung dieser Methode innerhalb einer Klasse, es sei denn, Sie greifen über eine Schnittstelle auf diese Methode zu. In diesem Fall wechseln Sie zur Schnittstellenmethode und nicht zur eigentlichen Implementierung.

Gibt es eine Möglichkeit / Tipps (Tastenkombination oder etwas anderes), um auf diese tatsächliche Implementierung zuzugreifen? Andernfalls müssen Sie nur einen Kommentar hinzufügen, um sich daran zu erinnern, wo Sie ihn implementiert haben, der wirklich nicht produktiv und fehleranfällig ist!

Update: interessante Antworten, aber ich bin nicht wirklich zufrieden, weil alle umständlich sind. Ich werde ein genaues Beispiel geben:

IInterface iInterface = someObject;                        
iInterface.someMethod();

Wenn Visual Studio nur ein bisschen clever wäre, nur eine Zeile über dem Methodenaufruf zu schauen, würde es tatsächlich sehen, wo sich das eigentliche Objekt befindet. Und das würde mir viele Tastenanschläge ersparen und vermeiden, "Alle Referenzen finden" zu verwenden und dann die Zeilen mit meinen müden Augen zu scannen, um zu sehen, welche Zeile die richtige enthält :)

user310291
quelle
4
Wie würde es wissen, welche Implementierung Sie sehen wollten? (Ich kann die Typhierarchie anzeigen, um alle bekannten Implementierungen zu finden, aber das kann eine ReSharper-Funktion sein ... Ich bin nicht sicher.)
Jon Skeet
1
@supercat: Meinst du beim Debuggen?
Jon Skeet
2
ReSharper implementiert es, indem es eine Liste von Implementierungen bereitstellt, aus denen ausgewählt werden kann, wo es die spezifische nicht erkennen kann. Nettes Feature und ich vermisse es, da "Find All References" zu viel zurückbringt!
Fenton
4
Zum ersten Mal, dass ich gesehen habe, sagt Jon Skeet: "Ich bin nicht sicher." für eine C # -Frage in SO.
Muthu Ganapathy Nathan
3
@MuthuGanapathyNathan Er hat wahrscheinlich einmal versucht auszusehen, als wäre er ein Mensch.
Vort3x

Antworten:

257

Ich mache folgendes:

1) Klicken Sie mit der rechten Maustaste auf die Methode und klicken Sie auf "Anrufhierarchie anzeigen" (oder Verknüpfung Strg + K, Strg + T).

2) Erweitern Sie den Ordner "Implements x", in dem alle Implementierungen dieser Methode angezeigt werden. Klicken Sie auf eine, um dorthin zu gelangen.

Relativ schnell und einfach. Ärgerlicherweise scheint es jedoch kein Äquivalent für die Schnittstelle selbst zu geben.


Update : Ab Visual Studio 2015 Update 1 klicken Sie mit der rechten Maustaste auf eine Methode und wählen Sie Gehe zur Implementierung. Sie können es auch über Tasten> Optionen> Umgebung> Tastatur der Tastenkombination zuordnen und nach dem Befehl Edit.GoToImplementation suchen. Die Standardverknüpfung ist Ctrl+F12. ( F12Navigiert zur Benutzeroberfläche).


MajorRefactoring
quelle
Gute Problemumgehung. Ich halte mich daran, wenn ich Resharper nicht habe
Roman
5
Ich kann Schritt 1 überspringen. Einfach "Anrufhierarchie anzeigen" (oder Tastenkürzel Strg + K, Strg + T) direkt von Ihrem Arbeitsplatz aus und die Benutzeroberfläche insgesamt überspringen. Ich bin in VS 2013.
Tony L.
Gibt es einen Hotkey, um die Implementierung zu optimieren? Ich habe ALT-CTRL-F12 ohne Erfolg ausprobiert. (Peak ist ALT-F12)
Levi Fuller
46

Mit VS2013 können Sie den Cursor über die Methode setzen und Navigieren zu ... (STRG +,) verwenden. Alle Stellen werden angezeigt, an denen der Name deklariert ist. Funktioniert nicht gut, wenn verschiedene Schnittstellen dieselben Methodennamen verwenden.

Mit VS2015 Update 1 gibt es jetzt eine neue Verknüpfung mit dem Namen "Gehe zur Implementierung".

Rolf Kristensen
quelle
4
Sie können Alt + Ende verwenden, wenn Sie Resharper verwenden.
Brechtvhb
1
Hat bei mir nicht funktioniert. Ich verwende VS Express 2013 für Web.
Akira Yamamoto
Ich finde das als die einfachste Lösung, ohne die Hände von der Tastatur zu nehmen. Danke Rolf
Jp Vinjamoori
1
Dies ist die schnellstmögliche Lösung.
mbudnik
@brechtvhb Sie können dies auch auf Alt + Ende ohne R # setzen, indem Sie die Tastenkombination für den Befehl anpassen Edit.NavigateTo:)
Demoncodemonkey
17

Ich habe eine kostenlose Erweiterung für Visual Studio 2010 und Visual Studio 2012 mit dem Namen Inheritance Margin erstellt, um diese spezielle Funktion bereitzustellen und einen klaren Hinweis darauf zu geben, wann eine Methode aufgrund einer Signaturübereinstimmung eine Schnittstellenmethode implementiert. In der aktuellen Version können Sie mit der rechten Maustaste auf eine beliebige Glyphe klicken, um ein Menü mit Elementen zu erhalten, zu denen Sie navigieren können.

Vererbungsspanne - Visual Studio-Galerie

Bildschirmfoto
(Quelle: microsoft.com )

Sam Harwell
quelle
3
Der Resharper-Test ist bei der Arbeit abgelaufen, hat diese Erweiterung ausprobiert und es rockt! danke Kumpel
Giorgio Minardi
15

Klicken Sie mit der rechten Maustaste auf "Alle Referenzen suchen".

Dadurch wird die Codezeile für alle Stellen angezeigt, an denen die Methode verwendet wird, einschließlich der Schnittstellendeklaration und der Implementierungen der Schnittstellenmethode. Sie können dann auf die Zeile klicken, um zum Code-Speicherort zu springen.

Phil Carson
quelle
Dies gibt keine Umsetzung.
Robaticus
1
@ Robaticus tut es tatsächlich. Dies ist nicht der bequemste Weg, aber die Implementierungen werden mit allen anderen Referenzen gemischt.
Rex M
Das ist das einzige, was ich gerade mache, aber es ist vor allem
lästig,
6
Eine Alternative zum Finden von Symbolen ist die Anrufhierarchie. Die Methoden sind in einer Ordnerstruktur zusammengefasst: Calls To '...', Calls From '...' und Implements '...'
Phil Carson
4
Die Tastenkombination für "Alle Referenzen suchen" lautet Shift + F12.
IsmailS
8

Abhängig von der Version von Visual Studio, die Sie haben, sage ich bedingt "Ja".

Ich arbeite derzeit an Ultimate und habe keine anderen Versionen, um dies zu überprüfen. In Ultimate können Sie jedoch den Architektur-Explorer verwenden, um Implementierungen zu finden. Es ist etwas komplizierter als die Rechtsklick-Methode, aber so funktioniert es.

  • Gehe zu View->Architecture Explorer(oder STRG-W, N)
  • Klicken Sie auf Klassenansicht und suchen Sie den Namespace, der Ihre Schnittstelle enthält, in der folgenden Liste.
  • Rechts von der Namespace-Liste befindet sich eine vertikale Schaltfläche mit der Aufschrift Types. Klicke hier
  • Wählen Interfaces
  • Wählen Sie Ihre Schnittstelle aus der Liste
  • Eine vertikale Schaltfläche mit der Aufschrift Memberswird dann rechts angezeigt. Klicken Sie auf diese Schaltfläche
  • Wählen Sie Implemented by(unter Inbound Navigation) und es wird eine Liste der Implementierungen Ihrer Schnittstelle angezeigt.
  • Ein Doppelklick auf die Implementierung führt Sie zur Klasse.
Robaticus
quelle
Ich bin mir ziemlich sicher, dass Architecture Explorer nur die Ultimate Edition ist, aber das wird funktionieren.
Richard
Vielen Dank, ich habe nachgedacht, aber in diesem Zusammenhang möchte ich meinen Code schnell ändern.
user310291
6

Innerhalb von 2012 Ultimate können Sie die Benutzeroberfläche im Solution Explorer durchsuchen. Klicken Sie mit der rechten Maustaste auf die Benutzeroberfläche und wählen Sie "Abgeleitete Typen". Die implementierten Klassen werden im Lösungs-Explorer angezeigt. Ich bin mir nicht sicher, ob es in Express funktioniert.

Jack Liu Shurui
quelle
Hab das nicht bemerkt. Vielen Dank. <br/> Wenn es nur eine Möglichkeit gab, den Lösungs-Explorer dazu zu bringen, seinen Baum für die aktuell angezeigte Datei zu öffnen, muss ich nicht zuerst den Tooltip des Editors aufrufen, um den Pfad der Datei abzurufen, um ihn abzuleiten und dann zu navigieren über den Lösungs-Explorer zur Quelldatei, wo ich die Liste der implementierten By's für die Schnittstelle ermitteln kann ... Die Quellcode-Navigation sollte meiner Meinung nach eine wichtigere Funktion werden.
George
- Ich habe gerade den Befehl "Strg +], S" entdeckt, der den Lösungs-Explorer-Baum auf das aktuelle Bearbeitungsdokument erweitert (mit aktivem Dokument synchronisieren). Der resultierende Dateiknoten kann dann erweitert werden, um die enthaltenen Typen anzuzeigen, die wiederum mit der rechten Maustaste angeklickt werden können, um auf das Kontextmenü zuzugreifen, das den Befehl 'Abgeleitete Typen' enthält. Nett.
George
2
@George, Sie können Visual Studio auch IMMER die aktuell geöffnete Datei im Lösungs-Explorer über Extras -> Optionen -> Projekte und Lösungen -> Allgemein -> "Aktives Element im Lösungs-Explorer
verfolgen
VS2012 Premium hat auch diese Funktion. In VS2015 Enterprise wurde diese Funktion " Abgeleitete Typen " in zwei Funktionen " Abgeleitete Typen " und " Implementiert von " aufgeteilt, noch schöner :)
Kateees
6

Visual Studio 2015 Update 1 (veröffentlicht im Dezember 2015) hat jetzt standardmäßig eine Rechtsklick-Funktion zur Implementierung hinzugefügt.

PaulG
quelle
5

Wenn Sie Resharper verwenden, können Sie durch Drücken von STRG + F12 direkt zur Klassenmethode wechseln!

Maximc
quelle
4

Das ist nicht möglich. Was Sie beschreiben, wäre nur dann sinnvoll, wenn die Schnittstelle auf eine Implementierung beschränkt wäre.

Betrachten Sie dieses Beispiel:

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

Wenn Sie verwenden, gehen Sie zur Implementierung von Write in UseIWrite verwenden, gelangen Sie zur Deklaration der Schnittstelle, da zu diesem Zeitpunkt jede der IWrite-Implementierungen an die Methode übergeben werden kann.

Zum Glück bieten Ihnen einige Tools wie beispielsweise ReSharper die Möglichkeit , alle Verwendungszwecke der Methode zu finden, sodass Sie problemlos zur gewünschten Implementierung navigieren können.

m0sa
quelle
1
… Und wenn es nur eine Implementierung gibt, bringt Sie R # ohne weiteres direkt dorthin.
Jay
1
Es ist nicht kostenlos, Visual Studio jedoch auch nicht. Wie viel ist deine Zeit wert? :)
Jim Arnold
3
Es ist nicht so, dass ich nicht bezahlen möchte. Es ist das Prinzip: Dies ist eine ziemlich grundlegende Funktion des gesunden Menschenverstandes. Es ist beschämend, dass Sie noch einmal bezahlen müssen, wenn Sie bereits für VS bezahlt haben :)
user310291
3
@ user310291 Ich stimme Ihnen zwar zu, aber wenn Sie nicht das Produkt kaufen, das genau die von Ihnen gewünschte Funktion erfüllt, um einen Dritten dafür zu "bestrafen", dass er es nicht sofort zur Verfügung stellt, wird Ihnen die Nase abgeschnitten, um Ihr Gesicht zu ärgern.
TarkaDaal
1
Resharper bietet dies, ohne alle Verwendungen anzeigen zu müssen. Sie können auswählen, zu welcher Implementierung Sie wechseln möchten.
Michael Joyce
4

Visual Studio mit Update 1 implementiert diese Funktion jetzt! Klicken Sie einfach mit der rechten Maustaste auf das Mitglied und Sie sollten "Zur Implementierung gehen" direkt unter "Zur Definition gehen" sehen.

Jason Steele
quelle
2

Schauen Sie sich diesen neuen kostenlosen Visual Studio 2013 Extension - Implementator an . Es fügt dem Kontextmenü des Visual Studio-Editors die Option "Zur Implementierung wechseln" hinzu.

Es ist nicht so zuverlässig und schnell wie Resharper, aber es macht seinen Job ganz gut.

Yura
quelle
2

Sie können die Ctrl + F12Verknüpfung versuchen . Es führt Sie zur Implementierung, genauso wie es Sie zu Nicht-Schnittstellenmethoden mit F12 führt. [Ich habe es in VS 2017 versucht, bin mir bei anderen Versionen nicht sicher]

Akbar Badhusha
quelle
1
Diese Verknüpfung funktioniert gut bei vscode mit Typoskript.
Zuhair Taha
1

Visual Studio kann Ihnen nur sagen, wo darauf verwiesen wird, dies ist jedoch möglicherweise zu grob.

Es gibt andere Tools, die Ihnen mehr über die Struktur Ihrer Anwendung erzählen können, einschließlich welcher Klasse welche Schnittstelle implementiert, welche Methode welche andere Methode außer Kraft setzt und so weiter. Ich persönlich bevorzuge Understand For C / C ++.

Patrick
quelle
1

Wenn Sie zur Deklaration gehen, wird die Schnittstellenmethode geöffnet. Wenn Sie zur Implementierung gehen, erhalten Sie die Klassen, die den Code für diese Schnittstellenmethode implementieren (oder nicht die Schnittstellenmethode selbst), oder listen sie für Sie auf.

Aktualisieren

Wie Jon Skeet in den Kommentaren betonte (und ich habe es vor der Beantwortung verpasst), könnte die von mir beschriebene Funktion eine ReSharper-Funktion sein ... keine Visual Studio-Funktion.

Jamie Dixon
quelle
0

Nein. Dies ist trotz der aufwändigen Speichercodestruktur, die von VS verwaltet wird, nicht möglich. Die Code-Navigation ist ziemlich ... geizig.

Es scheint, dass die einzige Alternative eine globale Suche mit "Alle Referenzen suchen" ist, gefolgt von einer manuellen Suche in der resultierenden Liste, um typisierte Wertdeklarationen, Konvertierungen usw. oder die Verwendung anderer Tools in VS außer dem Code-Editor auszuschließen. Alles ziemlich komplex und enttäuschend.

George
quelle