Чи є спосіб перейти до реальної реалізації методу за інтерфейсом?


182

У Visual Studio, коли ви клацніть правою кнопкою миші виклик методу, ви переходите до реалізації цього методу всередині класу, за винятком випадків, коли ви отримуєте доступ до цього методу через інтерфейс: у такому випадку ви переходите до методу інтерфейсу не до фактичної реалізації.

Чи є спосіб / поради (ключовий ярлик чи що-небудь) отримати доступ до цієї реальної реалізації? В іншому випадку ви застрягли, щоб додати коментар, щоб пам’ятати, де ви це здійснили, що насправді не є продуктивними та схильними до помилок!

Оновлення: цікаві відповіді, але я не дуже задоволений, тому що всі громіздкі. Я наведу точний приклад:

IInterface iInterface = someObject;                        
iInterface.someMethod();

Насправді, якби Visual Studio був трохи розумнішим, щоб подивитися лише на один рядок над методом виклику, він би бачив, де справжній об’єкт. І це допоможе мені врятувати багато натискань на клавіші і уникати використання "знайти всі посилання", а потім сканувати рядки втомленими очима, щоб побачити, який рядок містить правильний :)


4
Як би знати, яку реалізацію ви хотіли бачити? (Я можу переглянути ієрархію типів, щоб знайти всі відомі реалізації, але це може бути функція ReSharper ... Я не впевнений.)
Jon Skeet,

1
@supercat: Ви маєте на увазі під час налагодження?
Джон Скіт

2
ReSharper реалізує його, надаючи список реалізацій, щоб вибрати, де він не може виявити конкретну. Приємна функція, і я пропускаю її, оскільки "Знайти всі посилання" повертає занадто багато!
Фентон

4
Перший раз, коли я бачив, Джон Скіт говорить: "Я не впевнений". для питання C # в SO.
Муту Ганапатій Натан

3
@MuthuGanapathyNathan Напевно, він намагався колись виглядати так, як він людина.
Vort3x

Відповіді:


258

Я роблю наступне:

1) Клацніть правою кнопкою миші метод і натисніть «Переглянути ієрархію викликів» (або ярлик Ctrl + K, Ctrl + T)

2) Розгорніть папку "Реалізує х", яка потім покаже вам всі реалізації цього методу. Клацніть на одну, щоб перейти туди.

Відносно швидко і легко. Прикро, хоча, здається, не є рівнозначним для самого інтерфейсу.


оновлення : станом на оновлення Visual Studio 2015 1 клацніть правою кнопкою миші на методі та виберіть перейти до реалізації. Ви також можете зіставити його на комбінації клавіш за допомогою Інструментів> Опції> Навколишнє середовище> Клавіатура та знайти команду Edit.GoToImplementation. Ярлик по замовчуванню - Ctrl+F12. ( F12перейде до інтерфейсу).



Гарне вирішення. Я дотримуюся цього, коли у мене немає Resharper
Роман

5
Я можу пропустити крок 1. Просто "Переглянути ієрархію викликів" (або ярлик Ctrl + K, Ctrl + T) прямо з місця роботи, і пропустити інтерфейс усі разом. Я у VS 2013.
Тоні Л.

Чи є гаряча клавіша для піку реалізації? Я пробував ALT-CTRL-F12 без успіху. (Пік ALT-F12)
Леві Фуллер

47

За допомогою VS2013 можна розмістити курсор на методі та використовувати Навігацію до ... (CTRL +,), і він відобразить усі місця, де оголошено ім'я. Не працює добре, якщо різні інтерфейси використовують однакові назви методів.

З оновленням VS2015 1 з'явився новий ярлик під назвою "Перейти до реалізації".


4
Ви можете використовувати Alt + End, якщо ви використовуєте resharper.
brechtvhb

1
Не працювало для мене. Я використовую VS Express 2013 для Інтернету.
Акіра Ямамото

Я вважаю це найпростішим soln, не беручи слухавку з клавіатури. Дякую
Рольфу

1
Це найшвидше рішення.
mbudnik

@brechtvhb Ви також можете встановити це як Alt + End без R #, налаштувавши комбінацію клавіш для команди Edit.NavigateTo:)
demoncodemonkey

17

Я створив безкоштовне розширення для Visual Studio 2010 та Visual Studio 2012 під назвою Inheritance Margin, щоб забезпечити цю специфічну особливість, а також дати чітку інформацію про те, коли метод реалізує метод інтерфейсу через відповідність підпису. У поточній версії ви можете клацнути правою кнопкою миші на будь-якому гліфі, щоб отримати меню елементів, до яких можна перейти.

Поля спадкування - галерея Visual Studio

Знімок екрана
(джерело: microsoft.com )


3
Закінчився термін випробування на реалізацію, спробував це розширення, і воно гойдається! спасибі чувак
Джорджіо Мінарді

15

Клацніть правою кнопкою миші та «Знайти всі посилання».

Це покаже рядок коду для всіх місць, де використовується метод, включаючи оголошення інтерфейсу та реалізацію методу інтерфейсу. Потім ви можете натиснути рядок, щоб перейти до місця розташування коду.


Це не дає імплементації.
Робатикус

1
@Robaticus насправді це робить. Це не найзручніший спосіб, але реалізація буде змішана з усіма іншими посиланнями.
Рекс М

Це єдине, що я роблю зараз, але це втомлює перш за все, оскільки у мене немає гарних очей :)
user310291

6
Альтернативою пошуку символів є ієрархія викликів. У ньому є методи, згруповані в структурі папок: Calls To '...', Calls From '...' and Implements '...'
Phil Carson

4
Клавіша швидкого доступу для "Знайти всі посилання" є Shift + F12.
ІсмаїлС

8

Залежно від наявної у вас версії Visual Studio, я умовно скажу «так».

Зараз я працюю на Ultimate, і не маю інших версій, щоб це підтвердити. Це означає, що в межах Ultimate ви можете використовувати Провідник архітектури для пошуку реалізацій. Це трохи більше, ніж метод правого клацання, але ось як це працює.

  • Перейдіть до View->Architecture Explorer(або CTRL-W, N)
  • Клацніть Перегляд класів та знайдіть у списку, що відкриється, простір імен, що містить ваш інтерфейс.
  • Праворуч від списку простору імен розташована вертикальна кнопка, на якій написано Types. Натисніть це
  • Виберіть Interfaces
  • Виберіть інтерфейс зі списку
  • Вертикальна кнопка з написом Membersз’явиться праворуч. Натисніть на цю кнопку
  • Виберіть Implemented by(під Inbound Navigation), і це надасть список реалізацій вашого інтерфейсу.
  • Подвійне натискання на реалізацію перенесе вас до класу.

Я впевнений, що архітектура Explorer - це Ultimate Edition, але це спрацює.
Річард

Дякую дуже добре, що я подумав, але в цьому контексті я хочу швидко змінити свій код.
користувач310291

6

Протягом 2012 Ultimate ви можете шукати інтерфейс у провіднику рішень. Клацніть правою кнопкою миші інтерфейс і виберіть "Похідні типи", реалізовані класи будуть показані в провіднику рішень. Не впевнений, чи працює це експрес.


Не помічав цього. Дякую. <br/> Тепер, якщо існував лише спосіб отримати провідник рішень, щоб відкрити його дерево для файлу, що відображається в даний момент, тому я не повинен спочатку піднести підказку редактора, щоб отримати шлях до файлу, щоб отримати шлях, а потім перейти через провідник рішень у вихідний файл, де я можу визначити список реалізованих для інтерфейсу ... Навігація по вихідному коду повинна стати важливішою особливістю, на мою думку.
Джордж

- Щойно виявлено команду "Ctrl +], S", яка розширює дерево провідника рішень на поточний документ редагування (синхронізація з активним документом). Отриманий вузол файлу може бути потім розширений, щоб відкрити містяться типи, які, в свою чергу, можна клацнути правою кнопкою миші для доступу до контекстного меню, що містить команду "Похідні типи". Приємно.
Джордж

2
@George, Ви також можете мати Visual Studio ЗАВЖДИ відстежувати поточний відкритий файл у провіднику рішень через Інструменти -> Параметри -> Проекти та рішення -> Загальне -> "Відстежувати активний елемент у провіднику рішень"
MajorRefactoring

VS2012 Premium також має цю функцію. У VS2015 Enterprise ця функція " Похідні типи " була розділена на дві функції " Похідні типи " та " Реалізовано ", ще приємніше :)
cateyes

6

Visual Studio 2015 Update 1 (вийшов у грудні 2015 року) тепер додав функцію правого клацання правою кнопкою миші «Перейти до реалізації» як стандарт.


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

Якщо ви використовуєте перейти до реалізації Write in UseIWrite, це приведе вас до декларації інтерфейсу, оскільки в цей момент будь-яка з реалізацій IWrite може бути передана в метод.

На щастя, деякі інструменти на зразок ReSharper пропонують вам знайти всі способи використання методу, щоб ви могли легко перейти до потрібної реалізації.


1
… І якщо є лише одна реалізація, R # доставить вас туди без зайвих прихисток.
Джей

1
Це не безкоштовно, але не є і Visual Studio. Скільки коштує ваш час? :)
Джим Арнольд

3
Справа не в тому, що я не хочу платити, це за принципом: це цілком основна особливість здорового глузду, шкода, що вам доведеться платити ще раз, коли ви вже заплатили за VS :)
user310291

3
@ user310291 Хоча я погоджуюся з вами, не купуючи продукт, який виконує саме ту функцію, яку ви хочете, щоб "покарати" третьою стороною за те, що вона не надала її в коробку, відрізає вам ніс, щоб пошкодити обличчя.
TarkaDaal

1
Resharper забезпечує це, не показуючи всі звичаї. Ви можете вибрати, до якої реалізації потрібно перейти.
Майкл Джойс

4

Visual Studio з оновленням 1 тепер реалізує цю функцію! Просто клацніть правою кнопкою миші та ви побачите пункт "Перейти до реалізації" прямо під пунктом "Перейти до визначення".


2

Перегляньте це нове безкоштовне розширення Visual Studio 2013 - впроваджувач . Він додає опцію "Перейти до реалізації" в контекстне меню редактора Visual Studio.

Це не так надійно і швидко, як Resharper, але це добре працює.


2

Ви можете спробувати Ctrl + F12ярлик. Це приведе вас до реалізації так само, як призведе до неінтерфейсних методів, що використовують F12. [Я спробував це в VS 2017, не впевнений в інших версіях]


1
цей ярлик працює чудово при vscode з typecript.
Zuhair Taha

1

Visual Studio може сказати вам лише, куди на нього посилається, але це може бути занадто грубо.

Є й інші інструменти, які можуть розповісти вам більше про структуру вашої програми, включаючи, який клас реалізує, який інтерфейс, який метод перекриває, який інший метод тощо. Я особисто вважаю за краще використовувати Understand For C / C ++.


1

Перехід до декларації відкриє метод інтерфейсу. Перейшовши на реалізацію, ви заберете або перелічіть для вас класи, які реалізують код для цього методу інтерфейсу (а не сам метод інтерфейсу).

Оновлення

Як зазначив Джон Скіт у коментарях (і я пропустив, перш ніж відповісти), описана нами функція може бути функцією ReSharper ... а не Visual Studio.


0

Ні. Це неможливо, незважаючи на складну структуру коду пам’яті, що підтримується VS, навігація по коду є доволі… стислою.

Здається, єдиною альтернативою є глобальний пошук за допомогою "Знайти всі довідки" з подальшим ручним пошуком отриманого списку для виключення набраних оголошень значень, перетворень тощо або використання інших інструментів у VS, крім редактора коду. Все досить складно і невтішно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.