Apakah ada cara untuk menavigasi ke implementasi nyata metode di balik antarmuka?

182

Di Visual Studio, ketika Anda mengklik kanan pemanggilan metode, Anda pergi ke implementasi metode itu di dalam kelas kecuali jika Anda mengakses metode ini melalui antarmuka: dalam hal ini Anda pergi ke metode antarmuka bukan ke implementasi yang sebenarnya.

Apakah ada cara / tips (pintasan kunci atau apa pun) untuk mengakses implementasi aktual ini? Kalau tidak, Anda terjebak untuk menambahkan beberapa komentar hanya untuk mengingat di mana Anda menerapkannya yang benar-benar tidak produktif dan rentan kesalahan!

Perbarui: jawaban yang menarik tetapi saya tidak benar-benar puas karena semuanya rumit. Saya akan memberikan contoh yang tepat:

IInterface iInterface = someObject;                        
iInterface.someMethod();

Sebenarnya jika Visual Studio hanya sedikit pintar untuk melihat hanya satu baris di atas metode panggilan itu akan melihat di mana objek sebenarnya. Dan itu akan menyelamatkan saya banyak penekanan tombol dan menghindari menggunakan "menemukan semua referensi" dan kemudian memindai garis dengan mata lelah saya untuk melihat baris mana yang berisi yang benar :)

pengguna310291
sumber
4
Bagaimana ia tahu implementasi mana yang ingin Anda lihat? (Saya dapat melihat hierarki jenis untuk menemukan semua implementasi yang diketahui, tetapi itu mungkin fitur ReSharper ... Saya tidak yakin.)
Jon Skeet
1
@supercat: Maksud Anda saat debugging?
Jon Skeet
2
ReSharper mengimplementasikannya dengan menyediakan daftar implementasi untuk memilih dari mana ia tidak dapat mendeteksi yang spesifik. Fitur yang bagus dan saya sangat merindukannya karena "Temukan Semua Referensi" membawa kembali terlalu banyak!
Fenton
4
Pertama kali saya melihat, Jon Skeet berkata, "Saya tidak yakin." untuk pertanyaan C # di SO.
Muthu Ganapathy Nathan
3
@MuthuGanapathyNathan Dia mungkin mencoba terlihat seperti manusia sekali saja.
Vort3x

Jawaban:

258

Saya melakukan hal berikut:

1) Klik kanan pada metode dan klik "Lihat hierarki panggilan" (atau pintas Ctrl + K, Ctrl + T)

2) Buka folder "Implements x" yang kemudian akan menunjukkan kepada Anda semua implementasi metode itu. Klik satu untuk pergi ke sana.

Relatif cepat dan mudah. Mengganggu meskipun sepertinya tidak ada yang setara untuk antarmuka itu sendiri.


pembaruan : pada Visual Studio 2015 pembaruan 1, klik kanan pada metode dan pilih pergi ke implementasi. Anda juga dapat memetakannya ke pintasan keyboard melalui Alat> Opsi> Lingkungan> Keyboard dan mencari perintah Edit.GoToImplementation. Pintasan default adalah Ctrl+F12. ( F12akan menavigasi ke antarmuka).


MajorRefactoring
sumber
Penanganan yang baik. Saya berpegang teguh pada hal itu ketika saya tidak memiliki Resharper
Roman
5
Saya dapat melewati langkah 1. Cukup "Lihat hierarki panggilan" (atau pintas Ctrl + K, Ctrl + T) langsung dari tempat Anda bekerja dan lewati semua antarmuka secara bersamaan. Saya di VS 2013.
Tony L.
Apakah ada hotkey untuk memuncak implementasi? Saya mencoba ALT-CTRL-F12 tanpa hasil. (Peak is ALT-F12)
Levi Fuller
47

Dengan VS2013 seseorang dapat menempatkan kursor di atas metode, dan menggunakan Navigate To ... (CTRL +,), dan itu akan menampilkan semua lokasi di mana nama tersebut dideklarasikan. Tidak berfungsi dengan baik jika antarmuka yang berbeda menggunakan nama metode yang sama.

Dengan Pembaruan 1 VS2015 sekarang ada jalan pintas baru yang disebut "Go To Implementation".

Rolf Kristensen
sumber
4
Anda dapat menggunakan Alt + End jika Anda menggunakan resharper.
brechtvhb
1
Tidak bekerja untuk saya. Saya menggunakan VS Express 2013 untuk Web.
Akira Yamamoto
Saya menemukan ini sebagai soln paling sederhana, tanpa mengambil lepas tangan Anda dari keyboard. Terima kasih Rolf
Jp Vinjamoori
1
Ini adalah solusi tercepat yang mungkin.
mbudnik
@brechtvhb Anda juga dapat mengatur ini menjadi Alt + End tanpa R # dengan menyesuaikan pintasan keyboard untuk perintah Edit.NavigateTo:)
demoncodemonkey
17

Saya membuat ekstensi gratis untuk Visual Studio 2010 dan Visual Studio 2012 yang disebut Inheritance Margin untuk menyediakan fitur khusus ini, serta memberikan indikasi yang jelas ketika suatu metode mengimplementasikan metode antarmuka karena pencocokan tanda tangan. Dalam versi saat ini, Anda dapat mengklik kanan setiap mesin terbang untuk mendapatkan menu item untuk dinavigasi.

Margin Warisan - Galeri Visual Studio

Tangkapan layar
(sumber: microsoft.com )

Sam Harwell
sumber
3
Uji coba resharper telah kedaluwarsa di tempat kerja, mencoba ekstensi ini dan itu berhasil! Terima kasih Bung
Giorgio Minardi
15

Klik kanan lalu "Temukan Semua Referensi".

Ini akan menampilkan baris kode untuk semua tempat di mana metode ini digunakan termasuk deklarasi antarmuka dan implementasi metode antarmuka. Anda kemudian dapat mengklik pada baris untuk melompat ke lokasi kode.

Phil Carson
sumber
Ini tidak memberikan penerapan.
Robaticus
1
@Robaticus sebenarnya, benar. Ini bukan cara yang paling nyaman, tetapi implementasinya akan dicampur dengan semua referensi lainnya.
Rex M
Itulah satu-satunya hal yang saya lakukan sekarang tetapi melelahkan di atas semua karena saya tidak memiliki mata yang baik :)
user310291
6
Alternatif untuk menemukan simbol adalah hirarki panggilan. Ini memiliki metode yang dikelompokkan dalam struktur folder: Panggilan Ke '...', Panggilan Dari '...' dan Implements '...'
Phil Carson
4
Tombol pintas untuk "Temukan Semua Referensi" Shift + F12.
IsmailS
8

Bergantung pada versi Visual Studio yang Anda miliki, saya akan mengatakan dengan syarat "ya."

Saya saat ini beroperasi di Ultimate, dan tidak memiliki versi lain untuk memverifikasi ini. Yang mengatakan, dalam Ultimate, Anda dapat menggunakan Arsitektur Explorer untuk menemukan implementasi. Ini sedikit lebih terlibat daripada metode klik kanan, tapi inilah cara kerjanya.

  • Pergi ke View->Architecture Explorer(atau CTRL-W, N)
  • Klik pada Tampilan Kelas dan temukan namespace yang berisi antarmuka Anda di daftar yang terbuka.
  • Di sebelah kanan daftar namespace, adalah tombol vertikal yang bertuliskan Types. Klik ini
  • Pilih Interfaces
  • Pilih antarmuka Anda dari daftar
  • Tombol vertikal yang mengatakan Membersakan muncul di sebelah kanan. Klik tombol itu
  • Pilih Implemented by(di bawah Inbound Navigation) dan itu akan memberikan daftar implementasi antarmuka Anda.
  • Mengklik dua kali pada implementasi akan membawa Anda ke kelas.
Robaticus
sumber
Saya cukup yakin Architecture Explorer adalah edisi Ultimate saja, tetapi ini akan berhasil.
Richard
Terima kasih cukup baik, saya mengacau tapi dalam konteks ini saya ingin cepat untuk mengubah kode saya.
user310291
6

Dalam 2012 Ultimate, Anda dapat mencari antarmuka di explorer solusi. Klik kanan antarmuka dan pilih "Derived Types", kelas yang diimplementasikan akan ditampilkan dalam solusi explorer. Tidak yakin apakah itu berfungsi secara ekspres.

Jack Liu Shurui
sumber
Tidak memperhatikan itu. Terima kasih. <br/> Sekarang jika hanya ada cara untuk mendapatkan solusi explorer untuk membuka pohon itu ke file yang sedang ditampilkan, jadi saya tidak perlu membuka tooltip editor untuk mendapatkan path file sehingga untuk memperoleh jalur file sehingga untuk memperoleh kemudian menavigasi melalui solusi explorer ke file sumber, di mana saya dapat menentukan daftar diimplementasikan oleh antarmuka ... Navigasi kode sumber harus menjadi fitur yang lebih penting menurut saya.
George
- Baru saja menemukan perintah "Ctrl +], S" yang memperluas pohon solusi explorer ke dokumen edit saat ini (sinkronkan dengan dokumen aktif). Node file yang dihasilkan kemudian dapat diperluas untuk mengekspos jenis yang terkandung yang pada gilirannya dapat diklik kanan untuk mengakses menu konteks yang berisi perintah 'Derived Types'. Bagus.
George
2
@ George, Anda juga dapat meminta Visual Studio SELALU melacak file terbuka saat ini di penjelajah solusi melalui Alat -> Opsi -> Proyek dan Solusi -> Umum -> "Lacak item aktif di penjelajah solusi"
MajorRefactoring
VS2012 Premium juga memiliki fitur ini. Di VS2015 Enterprise, fitur ' Derived Types ' ini telah dipisah menjadi dua fitur ' Derived Types ' & ' Diimplementasikan Oleh ', bahkan lebih bagus :)
cateyes
6

Visual Studio 2015 Pembaruan 1 (dirilis Desember 2015) sekarang telah menambahkan klik kanan fitur 'Pergi Ke Implementasi' sebagai standar.

PaulG
sumber
5

Bagi orang yang menggunakan Resharper, menekan CTRL + F12 akan membuat Anda langsung menuju metode kelas!

Maxim
sumber
4

Ini tidak mungkin. Apa yang Anda gambarkan akan masuk akal hanya jika antarmuka akan terbatas pada 1 implementasi.

Pertimbangkan contoh ini:

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

Jika Anda menggunakan pergi ke implementasi Write di UseIWrite, itu akan membawa Anda ke deklarasi antarmuka, karena pada saat itu salah satu implementasi IWrite dapat diteruskan ke metode.

Untungnya beberapa alat seperti misalnya ReSharper menawarkan Anda untuk menemukan semua penggunaan metode ini, sehingga Anda dapat dengan mudah menavigasi ke implementasi yang diinginkan.

m0sa
sumber
1
... dan jika hanya ada satu implementasi, R # akan membawa Anda langsung ke sana tanpa basa-basi lagi.
Jay
1
Ini tidak gratis, tetapi Visual Studio juga tidak. Berapa nilai waktu Anda? :)
Jim Arnold
3
Bukannya saya tidak ingin membayar, Ini pada prinsipnya: ini adalah fitur akal sehat yang cukup mendasar, itu memalukan Anda harus membayar sekali lagi ketika Anda sudah membayar untuk VS :)
user310291
3
@ user310291 Sementara saya setuju dengan Anda, tidak membeli produk yang melakukan persis fitur yang Anda inginkan untuk "menghukum" pihak ketiga karena tidak menyediakannya di luar kotak, memotong hidung Anda untuk mengesalkan wajah Anda.
TarkaDaal
1
Resharper menyediakan ini tanpa harus menunjukkan semua penggunaan. Anda dapat memilih implementasi yang ingin Anda tuju.
Michael Joyce
4

Visual Studio dengan Pembaruan 1 sekarang mengimplementasikan fitur ini! Cukup klik kanan anggota dan Anda akan melihat "Pergi ke implementasi" tepat di bawah "Pergi ke definisi".

Jason Steele
sumber
2

Lihat perpanjangan Visual Studio 2013 baru - Implementator . Ini menambahkan opsi "Pergi ke implementasi" ke menu konteks editor Visual Studio.

Ini tidak begitu andal dan secepat Resharper, tetapi apakah itu pekerjaan dengan baik.

Yura
sumber
2

Anda dapat mencoba Ctrl + F12pintasan. Ini akan mengarahkan Anda ke implementasi sama seperti itu akan mengarahkan Anda ke metode non-antarmuka menggunakan F12. [Saya mencobanya di VS 2017, tidak yakin tentang versi lain]

Akbar Badhusha
sumber
1
pintasan ini berfungsi dengan baik di vscode dengan naskah.
Zuhair Taha
1

Visual Studio hanya dapat memberi tahu Anda di mana itu direferensikan, tetapi ini mungkin terlalu kasar.

Ada alat lain yang dapat memberi tahu Anda lebih banyak tentang struktur aplikasi Anda, termasuk kelas mana yang mengimplementasikan antarmuka mana, metode mana yang mengesampingkan metode mana yang lain, dan sebagainya. Saya pribadi lebih suka menggunakan Understand For C / C ++.

Patrick
sumber
1

Pergi ke deklarasi akan membuka metode antarmuka. Pergi ke implementasi, akan membawa Anda, atau daftar untuk Anda, kelas-kelas yang mengimplementasikan kode untuk metode antarmuka itu (bukan metode antarmuka itu sendiri).

Memperbarui

Seperti yang ditunjukkan oleh Jon Skeet dalam komentar (dan saya ketinggalan sebelum menjawab), fitur yang saya jelaskan mungkin fitur ReSharper ... bukan Visual Studio.

Jamie Dixon
sumber
0

Tidak. Ini tidak mungkin, meskipun struktur kode memori rumit yang dikelola oleh VS, navigasi kode agak ... pelit.

Tampaknya satu-satunya alternatif adalah pencarian global dengan "Temukan Semua Referensi" diikuti dengan pencarian manual dari daftar yang dihasilkan untuk mengecualikan deklarasi nilai yang diketik, konversi, dll. Atau penggunaan alat lain dalam VS selain editor kode. Semua agak rumit dan mengecewakan.

George
sumber