2010-09-01 15 views
6

Aşağıdaki kodu göz önünde bulundurun:Üst nesne alanına, özelliğine veya yöntemine başvururken 'base' ve 'this' arasında bir fark var mı?

public class Vehicle 
{ 
    public void StartEngine() 
    { 
     // Code here. 
    } 
} 

public class CityBus : Vehicle 
{ 
    public void MoveToLocation(Location location) 
    { 
     ////base.StartEngine(); 
     this.StartEngine(); 
     // Do other stuff to drive the bus to the new location. 
    } 
} 

this.StartEngine(); ile base.StartEngine(); arasında herhangi bir fark var mı, yoksa ikinci durumda StartEngine yöntemi CityBus sınıfına taşınamaz veya geçersiz kılınamaz mı? Performans etkisi var mı?

cevap

3

Tek fark, ebeveyn sınıfınıza, basit bir kalıtımla aynı yerde sona eren örtülü bir ifadeye bakacak açık bir çağrıdır. Performans farkı ihmal edilebilir. Hans Passant'ın dediği gibi, base.tartEngine() çağrısı, StartEngine sanal bir noktada yaparsanız garip davranışlara neden olur.

Doğru yeri bulmak için niteleyiciye ihtiyacınız yok. Açık kodlandığında, this.StartEngine() hemen hemen her zaman yedeklidir. Sen dolaylı nesne listesinde bir this referansı koyar koduna sahip olabilir, ancak o zaman çağrılan listede referans var:

public class Vehicle 
{ 
    public void StartEngine() 
    { 
     // Code here. 
    } 

    //For demo only; a method like this should probably be static or external to the class 
    public void GentlemenStartYourEngines(List<Vehicle> otherVehicles) 
    { 
     otherVehicles.Add(this); 

     foreach(Vehicle v in Vehicles) v.StartEngine(); 
    } 
} 
6

Fark yok, StartEngine() sanal değil. Tabanı sanallaştırmak için yeniden düzenleyecekseniz, üssü kullanmamalısınız. Perf diff ölçülebilir değildir.

2

bu durumda kesinlikle hiçbir performans farkı yoktur.

StartEngine sanal olmadığından, derleyici ve daha sonra jitter, temelde, türetilmiş sınıfta mı yoksa dış sınıfta mı olduğuyla ilgili bir çağrının tam olarak ne anlama geldiğini bilir. StartEngine sanal vardı ve derleyici ve/veya titreşim yerine bir Citybus türetilen bir şey daha Citybus açısından Aradığınız olmadığını anlıyoruz Eğer

sonra (çok küçük) fark da kaldırılmış olabilir ne var bir optimizasyon olarak.

StartEngine sanal ise ve derleyici ve/veya jitter türetilmiş bir sınıf yerine bir CityBus'u çağırıp aramayacağınızı belirleyemezse, temel veya doğrudan çağrı arasındaki fark, doğruluk açısından hayati önem taşır. Kural olarak, base. ile bir baz yöntemini çağıran tek yer, daha temiz hale getirmek için bu yöntemin geçersiz kılınmasıdır. Baz ve türevli sürüm arasındaki fark başka bir yerde önemliyse,'un base.SomeNonVirtual()'a bağlanmasını sağlayacak şekilde refactor denemelisiniz, bu nedenle derived.SomeVirtualMethod() davranışı değiştirdiğinde bile her zaman kullanılabilir.

İlgili konular