Bir arabirimin arkasındaki yöntemin gerçek uygulamasına gitmenin bir yolu var mı?


182

Visual Studio'da, bir yöntem çağrısını sağ tıklattığınızda, bu yöntemin bir arabirim aracılığıyla erişmeniz dışında, bu yöntemin bir sınıf içinde uygulanmasına gidersiniz: bu durumda gerçek uygulamaya değil arabirim yöntemine gidersiniz.

Bu gerçek uygulamaya erişmenin bir yolu / ipucu (anahtar kısayolu veya herhangi bir şey) var mı? Aksi takdirde, nerede uyguladığınızı hatırlamak için gerçekten üretken olmayan ve hataya açık olmayan bir yorum eklemek için sıkışmışsınız!

Güncelleme: ilginç cevaplar ama gerçekten memnun değilim çünkü hepsi hantal. Kesin bir örnek vereceğim:

IInterface iInterface = someObject;                        
iInterface.someMethod();

Aslında Visual Studio, yöntem çağrısının sadece bir satırına bakmak için biraz akıllı olsaydı, gerçek nesnenin nerede olduğunu görecekti. Ve bu bana çok sayıda tuş vuruşunu kurtaracak ve "tüm referansları bul" kullanmaktan kaçınacak ve daha sonra hangi satırın doğru olanı içerdiğini görmek için çizgileri yorgun gözlerimle tarayacak :)


4
Hangi uygulamayı görmek istediğinizi nasıl bilebilir? (Bilinen tüm uygulamaları bulmak için tür hiyerarşisini görüntüleyebilirim, ancak bu bir ReSharper özelliği olabilir ... Emin değilim.)
Jon Skeet

1
@supercat: Hata ayıklama sırasında mı kastediyorsunuz?
Jon Skeet

2
ReSharper, belirli bir yeri algılayamayacağı bir uygulama listesi sağlayarak uygular. Güzel özellik ve "Tüm Referansları Bul" çok fazla geri getiriyor gibi kaçırmayın!
Fenton

4
İlk gördüğümde, Jon Skeet "Emin değilim" diyor. SO bir C # sorusu için.
Muthu Ganapathy Nathan

3
@MuthuGanapathyNathan Muhtemelen bir zamanlar insan gibi görünmeye çalışıyordu.
Vort3x

Yanıtlar:


258

Aşağıdakileri yaparım:

1) Yönteme sağ tıklayın ve "Çağrı hiyerarşisini görüntüle" ye (veya Ctrl + K, Ctrl + T kısayoluna) tıklayın

2) Daha sonra bu yöntemin tüm uygulamalarını gösterecek olan "Implements x" klasörünü genişletin. Oraya gitmek için birini tıklayın.

Nispeten hızlı ve kolay. Rahatsız edici olsa da arayüzün kendisi için eşdeğer görünmüyor.


güncelleştirme : Visual Studio 2015 güncelleştirme 1'den itibaren bir yönteme sağ tıklayın ve uygulamaya git'i seçin. Ayrıca Araçlar> Seçenekler> Çevre> Klavye ile klavye kısayoluyla eşleyebilir ve Edit.GoToImplementation komutunu arayabilirsiniz. Varsayılan kısa yoldur Ctrl+F12. ( F12arayüze gidecektir).



İyi bir geçici çözüm. Resharper'ım olmadığında buna bağlıyım
Roman

5
1. adımı atlayabiliyorum. Sadece çalıştığınız yerden "Çağrı hiyerarşisini görüntüle" (veya Ctrl + K, Ctrl + T kısayolu) ve arayüzü hep birlikte atlayın. VS 2013'teyim.
Tony L.

Uygulamayı Zirve Etmek için herhangi bir kısayol tuşu var mı? ALT-CTRL-F12'yi hiç denemeden denedim. (Tepe ALT-F12'dir)
Levi Fuller

47

VS2013 ile imleç yöntemin üzerine getirilebilir ve Şuraya Git ... (CTRL +,) kullanılabilir ve adın bildirildiği tüm konumlar görüntülenir. Farklı arabirimler aynı yöntem adlarını kullanıyorsa iyi çalışmaz.

İle VS2015 Güncelleme 1 "Go To Uygulama" adlı yeni kısayol şimdi var.


4
Yeniden paylaşıcı kullanıyorsanız Alt + End kullanabilirsiniz.
brechtvhb

1
Benim için çalışmadı. Web için VS Express 2013 kullanıyorum.
Akira Yamamoto

Bunu klavyeden elinizi almadan en basit çözüm olarak görüyorum. Teşekkürler Rolf
Jp Vinjamoori

1
Bu mümkün olan en hızlı çözümdür.
mbudnik

@brechtvhb Komut için klavye kısayolunu özelleştirerek bunu R # olmadan Alt + End olarak da ayarlayabilirsiniz Edit.NavigateTo:)
demoncodemonkey

17

Bu özel özelliği sağlamak için Visual Studio 2010 ve Visual Studio 2012 için Devralma Marjı adlı ücretsiz bir uzantı oluşturdum ve bir yöntem imza eşleşmesi nedeniyle bir arabirim yöntemi uyguladığında net bir gösterge verdim. Geçerli sürümde, gidilecek öğelerin menüsünü almak için herhangi bir glifi sağ tıklayabilirsiniz.

Kalıtım Marjı - Visual Studio Gallery

Ekran görüntüsü
(kaynak: microsoft.com )


3
Yeniden paylaşma denemesinin süresi doldu, bu uzantıyı denedi ve sallandı! teşekkürler dostum
Giorgio Minardi

15

Sağ tıklayın ve ardından "Tüm Referansları Bul" u tıklayın.

Bu, arabirim bildirimi ve arabirim yönteminin uygulamaları da dahil olmak üzere, yöntemin kullanıldığı tüm yerler için kod satırını görüntüler. Daha sonra kod konumuna atlamak için satırı tıklayabilirsiniz.


Bu imlpementation vermez.
Robaticus

1
@Robaticus aslında öyle. En uygun yol değildir, ancak uygulamalar diğer tüm referanslarla karıştırılacaktır.
Rex M

Şu anda yaptığım tek şey bu ama gözlerin iyi olmadığı için her şeyden yorucu :)
user310291

6
Sembol bulmanın bir alternatifi çağrı hiyerarşisidir. Bir klasör yapısında gruplandırılmış yöntemlere sahiptir: '...' Çağrısı, '...' Çağrıları ve '...' Çağrıları ...
Phil Carson

4
"Tüm Referansları Bul" için kısayol tuşu Shift + F12.
IsmailS

8

Sahip olduğunuz Visual Studio sürümüne bağlı olarak, koşullu olarak "evet" diyeceğim.

Şu anda Ultimate üzerinde çalışıyorum ve bunu doğrulamak için başka sürümlerim yok. Bununla birlikte, Ultimate içinde, uygulamaları bulmak için Mimari Gezgini'ni kullanabilirsiniz. Doğru tıklama yönteminden biraz daha karmaşıktır, ancak işte böyle çalışır.

  • Git View->Architecture Explorer(veya CTRL-W, N)
  • Sınıf Görünümü'ne tıklayın ve açılan listede arayüzünüzü içeren ad alanını bulun.
  • Ad alanı listesinin sağında yazan dikey bir düğme bulunur Types. Buna tıkla
  • seçmek Interfaces
  • Listeden arayüzünüzü seçin
  • MembersArdından, sağda dikey bir düğme görünür. Bu düğmeyi tıklayın
  • Implemented by(Altında Inbound Navigation) öğesini seçin ; bu, arayüzünüzün uygulamalarının bir listesini sağlar.
  • Uygulamaya çift tıklamak sizi sınıfa götürecektir.

Architecture Explorer'ın yalnızca Ultimate sürümü olduğundan eminim, ancak bu işe yarayacak.
Richard

Teşekkür ederim oldukça iyi başparmak yukarı ama bu bağlamda hızlı kodumu değiştirmek istiyorum.
user310291

6

2012 Ultimate içinde, çözüm gezgininde arayüzü arayabilirsiniz. Arayüzü sağ tıklayın ve "Türetilmiş Türler" i seçin, uygulanan sınıflar çözüm gezgininde gösterilecektir. Hızlı çalışıp çalışmadığından emin değilim.


Fark etmedim. Teşekkürler. <br/> Şimdi çözüm kaşifinin o anda görüntülenen dosyaya ağacı açmasını sağlamanın bir yolu olsaydı, bu yüzden türetmek için daha sonra gezinmek için dosyanın yolunu almak için düzenleyicinin araç ipucunu getirmedim çözüm explorer aracılığıyla kaynak dosya için, nerede uygulayabileceğiniz listesini belirlemek için arayüzü için ... Kaynak kodu navigasyon bence daha önemli bir özellik haline gelmelidir.
George

- Çözüm gezgini ağacını geçerli düzenleme belgesine (etkin belgeyle senkronize) genişleten "Ctrl +], S" komutunu keşfettim. Elde edilen dosya düğümü daha sonra içerilen türleri ortaya çıkaracak şekilde genişletilebilir ve bu da 'Türetilmiş Türler' komutunu içeren içerik menüsüne erişmek için sağ tıklanabilir. Güzel.
George

2
@George, ayrıca Visual Studio HER ZAMAN çözüm açık kaşifinde mevcut açık dosyayı Araçlar -> Seçenekler -> Projeler ve Çözümler -> Genel -> "Çözüm kaşifinde aktif öğeyi takip et"
yoluyla izlemenizi sağlar

VS2012 Premium da bu özelliğe sahiptir. In VS2015 Enterprise, bu ' Türetilmiş Türleri ' özelliği iki özelliklerine 'bölünme olmuştur Türetilmiş Türleri ' '& By Uygulanan ', hatta daha güzel :)
kedi gözleri

6

Visual Studio 2015 Güncelleştirme 1 (Aralık 2015'te piyasaya sürüldü) artık standart olarak sağ tıklatma 'Uygulamaya Git' özelliğini ekledi.


5

Resharper kullanan kişiler için CTRL + F12 tuşlarına basmak doğrudan sınıf yöntemine gitmenizi sağlayacaktır!


4

Bu mümkün değil. Açıkladığınız şey yalnızca arayüz 1 uygulama ile sınırlıysa mantıklı olacaktır.

Bu örneği düşünün:

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

Kullanıyorsanız uygulamaya gidin UseIWrite içinde Write, bunun nedeni IWrite uygulamaların herhangi bir yöntemle içine geçebileceğini noktada, arayüzün beyanı götürür.

Neyse ki, örneğin ReSharper gibi bazı araçlar , yöntemin tüm kullanımlarını bulmanızı sağlar , böylece istediğiniz uygulamaya kolayca gidebilirsiniz.


1
… Ve sadece bir uygulama varsa, R # sizi daha fazla uzatmadan doğrudan oraya götürecektir.
Jay

1
Ücretsiz değil, ama Visual Studio da değil. Zamanınız ne kadar? :)
Jim Arnold

3
Ben ödemek istemiyorum değil, bu prensipte: bu oldukça temel sağduyu özelliği, zaten VS için ödeme yaparken bir kez daha ödemek zorunda utanç verici :)
user310291

3
@ user310291 Sizinle aynı fikirdeyken, üçüncü bir kişiyi kutunun dışına çıkmadığı için "cezalandırmak" için tam olarak istediğiniz özelliği satın alan ürünü satın almamak, yüzünüzü eğmek için burnunuzu kesiyor.
TarkaDaal

1
Resharper bunu tüm kullanımları göstermek zorunda kalmadan sağlar. Hangi uygulamaya gitmek istediğinizi seçebilirsiniz.
Michael Joyce

4

Güncelleştirme 1 ile Visual Studio artık bu özelliği uygulamaktadır! Üyeye sağ tıklayın ve "Tanıma git" in hemen altında "Uygulamaya git" ifadesini görmelisiniz.


2

Bu yeni ücretsiz Visual Studio 2013 Uzantısına göz atın - Uygulayıcı . Visual Studio düzenleyicisi bağlam menüsüne "Uygulamaya git" seçeneği ekler.

Resharper kadar güvenilir ve hızlı değil, ama iş gayet iyi.


2

Ctrl + F12Kısayolu deneyebilirsiniz . Sizi F12 kullanarak arayüz dışı yöntemlere götürecek gibi uygulamaya yönlendirecektir. [VS 2017'de denedim, diğer sürümlerden emin değilim]


1
bu kısayol daktilo ile vscode iyi çalışır.
Zuhair Taha

1

Visual Studio yalnızca nereye başvurulduğunu söyleyebilir, ancak bu çok kaba olabilir.

Hangi sınıfın hangi arabirimi uyguladığını, hangi yöntemin diğer yöntemi geçersiz kıldığını vb. İçeren, uygulamanızın yapısı hakkında size daha fazla bilgi verebilecek başka araçlar da vardır. Ben şahsen C / C ++ için Understand kullanmayı tercih ederim.


1

Beyana gitmek arayüz yöntemini açacaktır. Uygulamaya gitmek, o arabirim yönteminin (arabirim yönteminin kendisini değil) kodunu uygulayan sınıfları alır veya listeler.

Güncelleme

Jon Skeet'in yorumlarda belirttiği gibi (ve cevap vermeden önce kaçırdım), tarif ettiğim özellik bir ReSharper özelliği olabilir ... Visual Studio değil.


0

Hayır. VS tarafından tutulan bellek kodu yapısındaki ayrıntıya rağmen, kod navigasyonu oldukça cimri.

Tek alternatif, "Tüm Referansları Bul" ile global bir arama ve ardından yazılan değer bildirimlerini, dönüşümleri vb. Hepsi oldukça karmaşık ve hayal kırıklığı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.