C'è un modo per passare alla reale implementazione del metodo dietro un'interfaccia?


182

In Visual Studio, quando si fa clic con il pulsante destro del mouse su una chiamata al metodo, si passa all'implementazione di quel metodo all'interno di una classe, tranne se si accede a questo metodo tramite un'interfaccia: in tal caso si passa al metodo dell'interfaccia e non all'implementazione effettiva.

Esiste un modo / suggerimenti (tasto di scelta rapida o altro) per accedere a questa implementazione effettiva? Altrimenti sei bloccato per aggiungere qualche commento solo per ricordare dove lo hai implementato che non è davvero produttivo e soggetto a errori!

Aggiornamento: risposte interessanti ma non sono molto soddisfatto perché sono tutte ingombranti. Darò un esempio preciso:

IInterface iInterface = someObject;                        
iInterface.someMethod();

In realtà se Visual Studio fosse solo un po 'intelligente per guardare solo una riga sopra la chiamata del metodo, vedrebbe dove si trova l'oggetto reale. E questo mi farebbe risparmiare un sacco di battiture ed eviterei di usare "trova tutti i riferimenti" e quindi scansionare le linee con i miei occhi stanchi per vedere quale linea contiene quella giusta :)


4
Come farebbe a sapere quale implementazione volevi vedere? (Posso visualizzare la gerarchia dei tipi per trovare tutte le implementazioni conosciute, ma potrebbe essere una funzione ReSharper ... Non ne sono sicuro.)
Jon Skeet,

1
@supercat: Intendi durante il debug?
Jon Skeet,

2
ReSharper lo implementa fornendo un elenco di implementazioni tra cui scegliere dove non è possibile rilevare quello specifico. Bella funzionalità e mi manca perché "Trova tutti i riferimenti" riporta troppo!
Fenton,

4
La prima volta che ho visto, Jon Skeet dice "Non ne sono sicuro." per una domanda C # in SO.
Muthu Ganapathy Nathan,

3
@MuthuGanapathyNathan Probabilmente stava provando a sembrare una volta umano.
Vort3x,

Risposte:


258

Faccio quanto segue:

1) Fare clic con il tasto destro del mouse sul metodo e fare clic su "Visualizza gerarchia di chiamate" (o collegamento Ctrl + K, Ctrl + T)

2) Espandi la cartella "Implements x" che ti mostrerà tutte le implementazioni di quel metodo. Fare clic su uno per andare lì.

Relativamente veloce e facile. Anche se fastidiosamente non sembra esserci un equivalente per l'interfaccia stessa.


aggiornamento : a partire dall'aggiornamento 1 di Visual Studio 2015, fai clic con il pulsante destro del mouse su un metodo e seleziona vai all'implementazione. Puoi anche mapparlo sulla scorciatoia da tastiera tramite Strumenti> Opzioni> Ambiente> Tastiera e cerca il comando Edit.GoToImplementation. Il collegamento predefinito è Ctrl+F12. ( F12passerà all'interfaccia).



Buona soluzione. Mi attengo a questo quando non ho Resharper
Roman

5
Sono in grado di saltare il passaggio 1. Basta "Visualizza gerarchia delle chiamate" (o scorciatoia Ctrl + K, Ctrl + T) direttamente da dove si sta lavorando e saltare l'interfaccia tutti insieme. Sono in VS 2013.
Tony L.

Esiste un tasto di scelta rapida per raggiungere il picco dell'implementazione? Ho provato ALT-CTRL-F12 senza successo. (Il picco è ALT-F12)
Levi Fuller,

47

Con VS2013 è possibile posizionare il cursore sul metodo e utilizzare Naviga verso ... (CTRL +,) e visualizzerà tutte le posizioni in cui viene dichiarato il nome. Non funziona bene se interfacce diverse usano gli stessi nomi di metodo.

Con VS2015 Update 1 è ora disponibile un nuovo collegamento chiamato "Vai all'implementazione".


4
Puoi usare Alt + Fine se stai usando il resharper.
brechtvhb,

1
Non ha funzionato per me. Sto usando VS Express 2013 per il Web.
Akira Yamamoto,

Trovo che questo sia il soln più semplice, senza staccare la mano dalla tastiera. Grazie Rolf
Jp Vinjamoori,

1
Questa è la soluzione più rapida possibile.
mbudnik,

@brechtvhb Puoi anche impostare Alt + End senza R # personalizzando la scorciatoia da tastiera per il comando Edit.NavigateTo:)
demoncodemonkey

17

Ho creato un'estensione gratuita per Visual Studio 2010 e Visual Studio 2012 denominata Margine di ereditarietà per fornire questa funzionalità specifica, oltre a fornire una chiara indicazione quando un metodo implementa un metodo di interfaccia a causa di una corrispondenza della firma. Nella versione corrente, è possibile fare clic con il pulsante destro del mouse su qualsiasi glifo per ottenere un menu di elementi a cui accedere.

Margine di ereditarietà - Galleria di Visual Studio

Immagine dello schermo
(fonte: microsoft.com )


3
Il processo di resharper è scaduto al lavoro, ha provato questa estensione e si rompe! grazie amico
Giorgio Minardi,

15

Fare clic con il tasto destro, quindi "Trova tutti i riferimenti".

Verrà visualizzata la riga di codice per tutti i luoghi in cui viene utilizzato il metodo, inclusa la dichiarazione dell'interfaccia e le implementazioni del metodo dell'interfaccia. È quindi possibile fare clic sulla linea per passare alla posizione del codice.


Questo non dà l'imlpementazione.
Robaticus,

1
@Robaticus in realtà, lo fa. Non è il modo più conveniente, ma le implementazioni saranno mescolate con tutti gli altri riferimenti.
Rex M,

Questa è l'unica cosa che faccio in questo momento, ma è fastidioso soprattutto perché non ho buoni occhi :)
user310291

6
Un'alternativa alla ricerca di simboli è la gerarchia di chiamate. Ha i metodi raggruppati in una struttura di cartelle: Chiamate a '...', Chiamate da '...' e Implementa '...'
Phil Carson,

4
Tasto di scelta rapida per "Trova tutti i riferimenti" è Shift + F12.
IsmailS

8

A seconda della versione di Visual Studio che possiedi, dirò condizionalmente "sì".

Attualmente sto lavorando su Ultimate e non ho altre versioni per verificarlo. Detto questo, all'interno di Ultimate, è possibile utilizzare Architecture Explorer per trovare implementazioni. È un po 'più coinvolto rispetto al metodo del clic destro, ma ecco come funziona.

  • Vai a View->Architecture Explorer(o CTRL-W, N)
  • Fai clic su Class View e trova lo spazio dei nomi che contiene la tua interfaccia nell'elenco che si apre.
  • A destra dell'elenco dello spazio dei nomi, c'è un pulsante verticale che dice Types. Clicca qui
  • Selezionare Interfaces
  • Scegli la tua interfaccia dall'elenco
  • Un pulsante verticale che dice Membersapparirà quindi a destra. Fai clic su quel pulsante
  • Scegli Implemented by(sotto Inbound Navigation) e che fornirà un elenco di implementazioni della tua interfaccia.
  • Un doppio clic sull'implementazione ti porterà alla lezione.

Sono abbastanza sicuro che Architecture Explorer sia solo la versione Ultimate, ma funzionerà.
Richard

Grazie abbastanza bene ho sfogliato ma in questo contesto voglio essere veloce a cambiare il mio codice.
user310291

6

In 2012 Ultimate, puoi cercare l'interfaccia in Esplora soluzioni. Fare clic con il tasto destro del mouse sull'interfaccia e selezionare "Tipi derivati", le classi implementate verranno visualizzate in Esplora soluzioni. Non sono sicuro che funzioni in Express.


Non l'ho notato. Grazie. <br/> Ora, se ci fosse solo un modo per convincere la soluzione explorer ad aprire il suo albero al file attualmente visualizzato, quindi non ho prima richiamato il suggerimento dell'editor per ottenere il percorso del file in modo da derivarne, quindi navigare attraverso la soluzione explorer al file sorgente, dove posso determinare l'elenco dei implementati per l'interfaccia ... La navigazione del codice sorgente dovrebbe diventare una caratteristica più importante, penso.
George

- Ho appena scoperto il comando "Ctrl +], S" che espande l'albero dell'esploratore della soluzione al documento di modifica corrente (sincronizza con il documento attivo). Il nodo del file risultante può quindi essere espanso per esporre i tipi contenuti che a loro volta possono essere cliccati con il tasto destro per accedere al menu contestuale contenente il comando 'Tipi derivati'. Bello.
George

2
@George, puoi anche fare in modo che Visual Studio segua SEMPRE il file aperto corrente in Esplora soluzioni tramite Strumenti -> Opzioni -> Progetti e soluzioni -> Generale -> "
Tieni

VS2012 Premium ha anche questa funzione. In VS2015 Enterprise, questa funzione " Tipi derivati " è stata suddivisa in due funzioni " Tipi derivati " e " Implementato da ", ancora più bello :)
cateyes,

6

Visual Studio 2015 Update 1 (rilasciato a dicembre 2015) ha ora aggiunto un clic con il tasto destro del mouse sulla funzionalità "Vai all'implementazione" come standard.


5

Per le persone che usano Resharper, premere CTRL + F12 ti porterà direttamente al metodo di classe!


4

Non è possibile. Quello che stai descrivendo avrebbe senso solo se l'interfaccia fosse limitata a 1 implementazione.

Considera questo esempio:

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

Se usi vai all'implementazione di Write in UseIWrite, ti porta alla dichiarazione dell'interfaccia, perché a quel punto qualsiasi implementazione IWrite potrebbe essere passata al metodo.

Per fortuna alcuni strumenti come ad esempio ReSharper ti offrono di trovare tutti gli usi del metodo, in modo da poter navigare facilmente all'implementazione desiderata.


1
... e se c'è una sola implementazione, R # ti porterà direttamente lì senza ulteriori indugi.
Jay,

1
Non è gratuito, ma nemmeno Visual Studio. Quanto vale il tuo tempo? :)
Jim Arnold,

3
Non è che non voglio pagare, è sul principio: questa è una caratteristica di base del buonsenso, è vergognoso che tu debba pagare ancora una volta quando hai già pagato VS :)
user310291

3
@ user310291 Mentre sono d'accordo con te, non acquistare il prodotto che fa esattamente la funzione che vuoi per "punire" una terza parte per non averlo fornito fuori dalla scatola, ti sta tagliando il naso per disprezzare il tuo viso.
TarkaDaal,

1
Resharper fornisce questo senza dover mostrare tutti gli usi. Puoi selezionare l'implementazione a cui vuoi andare.
Michael Joyce,

4

Visual Studio con Update 1 ora implementa questa funzionalità! Basta fare clic destro sul membro e dovresti vedere "Vai all'implementazione" proprio sotto "Vai alla definizione".


2

Dai un'occhiata a questa nuova estensione gratuita di Visual Studio 2013 - Implementator . Aggiunge l'opzione "Vai all'implementazione" al menu contestuale dell'editor di Visual Studio.

Non è così affidabile e veloce come Resharper, ma fa bene il suo lavoro.


2

Puoi provare il Ctrl + F12collegamento. Ti porterà all'implementazione proprio come ti porterà a metodi non di interfaccia usando F12. [L'ho provato in VS 2017, non sono sicuro di altre versioni]


1
questo collegamento funziona bene su vscode con dattiloscritto.
Zuhair Taha,

1

Visual Studio può solo dirti dove viene fatto riferimento, ma potrebbe essere troppo approssimativo.

Esistono altri strumenti che possono fornire ulteriori informazioni sulla struttura dell'applicazione, tra cui quale classe implementa quale interfaccia, quale metodo prevale su quale altro metodo e così via. Personalmente preferisco usare Understand For C / C ++.


1

Andando alla dichiarazione si aprirà il metodo di interfaccia. Accedere all'implementazione ti porterà o elenca per te le classi che implementano il codice per quel metodo di interfaccia (non il metodo di interfaccia stesso).

Aggiornare

Come ha sottolineato Jon Skeet nei commenti (e mi sono perso prima di rispondere), la funzione che ho descritto potrebbe essere una funzione ReSharper ... non una di Visual Studio.


0

No. Questo non è possibile, nonostante l'elaborata struttura del codice di memoria gestita da VS, la navigazione del codice è piuttosto ... avara.

Sembra che l'unica alternativa sia una ricerca globale con "Trova tutti i riferimenti" seguita da una ricerca manuale dell'elenco risultante per escludere dichiarazioni di valori digitati, conversioni, ecc. O l'uso di altri strumenti all'interno di VS diversi dall'editor di codice. Tutto piuttosto complesso e deludente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.