インターフェイスの背後にあるメソッドの実際の実装に移動する方法はありますか?


182

Visual Studioでは、メソッド呼び出しを右クリックすると、クラスを介してそのメソッドの実装に移動します。ただし、インターフェイスを介してこのメ​​ソッドにアクセスする場合は除きます。その場合、実際の実装ではなくインターフェイスメソッドに移動します。

この実際の実装にアクセスする方法/ヒント(キーのショートカットなど)はありますか?それ以外の場合は、実際に生産的ではなく、エラーが発生しやすい、実装した場所を覚えておくためにコメントを追加するのに悩まされています!

更新:興味深い答えですが、すべてが面倒なので、私は本当に満足していません。正確な例を示します。

IInterface iInterface = someObject;                        
iInterface.someMethod();

実際、Visual Studioがメソッド呼び出しの上の1行だけを見るのが少し賢い場合は、実際のオブジェクトの場所がわかります。そして、それは私に多くのキーストロークを節約し、「すべての参照を見つける」の使用を避け、疲れた目で行をスキャンして、正しい行が含まれている行を確認します:)


4
どの実装を確認したいのか、どのようにしてわかりますか?(型階層を表示して、すべての既知の実装を見つけることができますが、それはReSharper機能かもしれません...わかりません。)
Jon Skeet

1
@supercat:デバッグ中ですか?
Jon Skeet、2011年

2
ReSharperは、特定の実装を検出できない場所から選択する実装のリストを提供することで実装します。素敵な機能です。「すべての参照を検索」で取り戻しすぎて、見逃してしまいます。
フェントン

4
ジョン・スキートが初めて見たのは「わかりません」。SOでのC#の質問。
Muthu Ganapathy Nathan 2013

3
@MuthuGanapathyNathan彼はおそらく彼がかつて人間であるように見せようとしていた。
Vort3x

回答:


258

私は次のことを行います:

1)メソッドを右クリックして、[呼び出し階層を表示]をクリックします(またはショートカットCtrl + K、Ctrl + T)。

2)「Implements x」フォルダを展開すると、そのメソッドのすべての実装が表示されます。そこをクリックしてください。

比較的迅速かつ簡単です。面倒なことに、インターフェース自体に相当するものはないようです。


update:Visual Studio 2015 update 1以降、メソッドを右クリックし、[実装に移動]を選択します。また、[ツール]> [オプション]> [環境]> [キーボード]からキーボードショートカットにマッピングして、Edit.GoToImplementationコマンドを検索することもできます。デフォルトのショートカットはCtrl+F12です。(F12インターフェイスに移動します)。



良い回避策。私はResharperがないときはそれに固執しています
Roman

5
ステップ1はスキップできます。作業しているところから直接「通話階層を表示」(またはショートカットCtrl + K、Ctrl + T)し、インターフェースをすべてスキップします。私はVS 2013年によ
トニー・L.

実装をピークにするためのホットキーはありますか?ALT-CTRL-F12を試してもうまくいきませんでした。(ピークはALT-F12です)
Levi Fuller

47

VS2013では、メソッドの上にカーソルを置き、[ナビゲート...](CTRL +、)を使用して、名前が宣言されているすべての場所を表示できます。異なるインターフェースが同じメソッド名を使用している場合、うまく機能しません。

VS2015 Update 1の「ゴーへのインプリメンテーション」と呼ばれる新しいショートカットが用意されました。


4
リシャーパーを使用している場合は、Alt + Endを使用できます。
brechtvhb 2014

1
私のために働いていませんでした。VS Express 2013 for Webを使用しています。
山本明

キーボードから手を離さずに、これが最も簡単な解決策だと思います。ありがとうロルフ
Jp Vinjamoori 2015年

1
これは可能な限り迅速な解決策です。
mbudnik 2015

@brechtvhbコマンドのキーボードショートカットをカスタマイズして、R#なしでAlt + Endに設定することもできますEdit.NavigateTo:)
demoncodemonkey

17

この特定の機能を提供するとともに、シグネチャの一致によりメソッドがインターフェイスメソッドを実装するときを明確に示すために、Visual Studio 2010およびVisual Studio 2012の無料の拡張機能であるInheritance Marginを作成しました。現在のバージョンでは、任意のグリフを右クリックして、移動する項目のメニューを表示できます。

継承マージン-Visual Studioギャラリー

スクリーンショット
(ソース:microsoft.com


3
リシャーパーの試用期間が終了したため、この拡張機能を試してみました。おかげで男
ジョルジオミナルディ

15

右クリックして[すべての参照を検索]を選択します。

これにより、インターフェイスの宣言やインターフェイスメソッドの実装など、メソッドが使用されるすべての場所のコード行が表示されます。その行をクリックすると、コードの場所にジャンプできます。


これは意味を与えません。
ロバティカス

1
@Robaticusは実際にそうです。これは最も便利な方法ではありませんが、実装は他のすべての参照と混合されます。
レックスM

それは今私がする唯一のことですが、私は目がよくないので何よりも面倒です:)
user310291

6
シンボルを見つける代わりに、呼び出し階層があります。これには、フォルダー構造にグループ化されたメソッドがあります:Calls To '...'、Calls From '...'およびImplements '...'
Phil Carson

4
「すべての参照を検索」のショートカットキーはShift + F12です。
IsmailS 2014

8

お使いのVisual Studioのバージョンに応じて、条件付きで「はい」と言います。

私は現在Ultimateで動作しており、これを確認する他のバージョンはありません。つまり、Ultimate内では、アーキテクチャエクスプローラーを使用して実装を見つけることができます。右クリックの方法より少し複雑ですが、ここではその仕組みを説明します。

  • 移動しますView->Architecture Explorer(またはCTRL-W、N)
  • クラスビューをクリックし、開いたリストからインターフェースを含む名前空間を見つけます。
  • 名前空間リストの右側には、という縦のボタンがありますTypes。こちらをクリック
  • 選択する Interfaces
  • リストからインターフェースを選択してください
  • すると言う垂直ボタンがMembers右側に表示されます。そのボタンをクリックしてください
  • Implemented by(下Inbound Navigation)を選択すると、インターフェースの実装のリストが表示されます。
  • 実装をダブルクリックすると、クラスに移動します。

Architecture ExplorerはUltimateエディションのみであると確信していますが、これは機能します。
Richard

いいねありがとうございました。このコンテキストでは、コードをすばやく変更したいと思います。
user310291 2011年

6

2012 Ultimateでは、ソリューションエクスプローラーでインターフェイスを検索できます。インターフェイスを右クリックして[派生型]を選択すると、実装されたクラスがソリューションエクスプローラーに表示されます。エクスプレスで動作するかどうかはわかりません。


気づかなかった。ありがとう。<br/>ソリューションエクスプローラーにツリーを開いて現在表示されているファイルを開く方法しかない場合、最初にエディターのツールチップを表示してファイルのパスを取得し、そこから派生してナビゲートする必要はありません。ソリューションエクスプローラーからソースファイルに移動します。ここで、インターフェイスの実装者のリストを決定できます...ソースコードのナビゲーションは、私が考えるより重要な機能になるはずです。
ジョージ

-ソリューションエクスプローラーツリーを現在の編集ドキュメント(アクティブドキュメントと同期)に展開する「Ctrl +]、S」コマンドを発見しました。次に、結果のファイルノードを展開して、含まれているタイプを表示し、右クリックして[派生タイプ]コマンドを含むコンテキストメニューにアクセスできます。いいね。
ジョージ

2
@George、ツール->オプション->プロジェクトとソリューション->全般->「ソリューションエクスプローラーでアクティブなアイテムを追跡する」を介して、ソリューションエクスプローラーで現在開いているファイルを常に追跡することもできます
MajorRefactoring

VS2012 Premiumにもこの機能があります。でVS2015エンタープライズ、この「派生型」機能は、二つの特徴「に分割された派生型」&「実装することにより」、でもよりよい:)
cateyes

6

Visual Studio 2015 Update 1(2015年12月リリース)に、右クリックの「実装に移動」機能が標準で追加されました。


5

Resharperを使用する人は、CTRL + F12を押すと、クラスメソッドに直接移動できます。


4

これは不可能です。あなたが説明していることは、インターフェースが1つの実装に制限される場合にのみ意味があります。

この例を考えてみましょう:

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

UseIWriteのWriteの実装へ移動を使用すると、インターフェイスの宣言に移動します。その時点で、IWrite実装のいずれかがメソッドに渡される可能性があるためです。

ありがたいことに、たとえばReSharperなどの一部のツールでは、メソッドのすべての使用法見つけることができるため、目的の実装に簡単に移動できます。


1
…そして実装が1つしかない場合は、R#を使用すれば、面倒なことはありません。
Jay

1
無料ではありませんが、Visual Studioも無料です。あなたの時間はいくらですか?:)
ジムアーノルド

3
それは私が支払いたくないということではありません、それは原則です:これは非常に基本的な常識的な機能です、あなたがすでにVSに支払ったときにもう一度支払う必要があるのは恥ずべきことです:)
user310291

3
@ user310291私はあなたに同意しますが、箱から出さないで第三者を「罰する」ためにあなたが望む機能を正確に実行する製品を購入しないことは、あなたの顔をせがむためにあなたの鼻を切り落としています。
TarkaDaal 2012年

1
Resharperは、すべての使用法を示す必要なく、これを提供します。行きたい実装を選択できます。
Michael Joyce

4

Visual Studio Update 1では、この機能が実装されています。メンバーを右クリックすると、[定義に移動]のすぐ下に[実装に移動]が表示されます。


2

この新しい無料のVisual Studio 2013 Extension- Implementatorを確認してください。Visual Studioエディターのコンテキストメニューに[実装に移動]オプションを追加します。

Resharperほど信頼性が高く高速ではありませんが、問題はありません。


2

Ctrl + F12ショートカットを試すことができます。F12を使用した非インターフェイスメソッドにつながるのと同じように、実装につながります。[私はVS 2017で試しましたが、他のバージョンについてはわかりません]


1
このショートカットは、typescriptを使用したvscodeで正常に機能します。
Zuhair Taha、

1

Visual Studioはそれがどこで参照されているかを通知するだけですが、これは粗すぎる場合があります。

どのクラスがどのインターフェースを実装するか、どのメソッドが他のどのメソッドを上書きするかなど、アプリケーションの構造についてより多くのことを伝えることができる他のツールがあります。個人的には、Understand For C / C ++の使用を好みます。


1

宣言に移動すると、インターフェースメソッドが開きます。実装に移動すると、インターフェースメソッド自体ではなく、そのインターフェースメソッドのコードを実装するクラスが表示されます。

更新

Jon Skeetがコメントで指摘したように(答える前に見逃した)、説明した機能はReSharper機能かもしれません... Visual Studioの機能ではないかもしれません。


0

いいえ。これは不可能です。VSが管理するメモリ内のコード構造は複雑ですが、コードナビゲーションはかなり...

唯一の選択肢は、「Find All Reference」を使用したグローバル検索に続いて、結果のリストを手動で検索して、型付き値の宣言、変換などを除外するか、コードエディター以外のVS内の他のツールを使用することです。すべてかなり複雑でがっかりします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.