SORU
27 Ocak 2009, Salı


Erken ve geç bağlama

Erken/geç bağlama C oluştuğunda benim kafamı toplamaya çalışıyorum#.

Sanal olmayan yöntemler her zaman erken bağlıdır. Sanal yöntemler her zaman geç bağlı: bağlamak için gerçek yöntemi çözmek için derleyici ekler ek kod yürütme zamanı ve tür güvenliği kontrol eder. Alt polimorfizmi geç bağlama kullanır.

Yansıma yöntemleri kullanarak arama bağlantısını geç bir örnektir. Derleyici aksine bunu başarmak için kod yazıyoruz. (E. g. COM bileşenleri arıyor.)

VB.NET Option Strict kapalı olduğunda örtülü geç bağlama destekler. Bir nesnenin geç bir değişken Nesne türü için ilan atanmış olduğu zaman bağlıdır. VB derleyici ekler yürütme zaman doğru yöntemi bağlamak için kod ve geçersiz aramaları yakalamak için. C# bu özelliği desteklemiyor.

Doğru yolda mıyım?

Ne delegeleri arayıp bir arayüz referansı aracılığıyla bir yöntemi çağırmak? Erken veya geç bağlama?

CEVAP
27 Ocak 2009, Salı


Her şeyi erken C bağlı# Yansıma arabirimi üzerinden gitmek sürece.

Erken bağlanmış sadece hedef yöntem derleme zamanında bulmuş olduğu anlamına gelir ve bu kodu çağıran oluşturulur. Kendi sanal ya (çağrı zamanda bulmak için fazladan bir adım var anlam ilgisi yoktur). Eğer bu yöntem yok diye derleyici kodu derlemek için başarısız olur.

Geç bağlı hedef yöntemi çalıştırma baktı demektir. Genellikle bu yöntem metin adını aramak için kullanılır. Eğer yöntem değil eğer, bang. Program veya çalışma zamanında bazı özel durum işleme düzeni çarpmak gidecek.

En betik dilleri geç bağlama ve derlenen diller, erken bağlama kullanın.

C# (sürüm 4 önce) bağlama geç değil; ancak yansıma API yapmak için kullanabilirsiniz. Bu API çalışma zamanında meclisleri aracılığıyla kazma işlev adları arar kodu derler. VB Seçeneği Sıkı kapalıysa geç bağlayabilirsiniz.

Bağlama genellikle performansı üzerinde bir etkisi vardır. Geç bağlama gerektirir zamanında aramaları nedeniyle, genellikle yöntem çağrıları erken bağlanmış yöntem çağrıları daha yavaş olduğu anlamına gelir.


Normal bir işlev için, derleyici bellekte sayısal konumunu hesaplayabilir. İşlevi bu adrese işlevini çağırmak için bir talimat verebilir çağrıldığında o zaman.

Herhangi bir sanal yöntemleri olan bir nesne için derleyici, v-tablo oluşturur. Bu aslında sanal yöntemlerin adreslerini içeren bir dizi. Sanal bir yöntem olan her nesne v-tablo adresi gizli bir üyesi derleyici tarafından oluşturulan içerir. Sanal bir işlev çağrıldığında, derleyici pozisyonu v-masa uygun yöntemin ne olduğunu anlayacaktır. Sonra kod nesneleri v-tabloya bak ve bu konumda sanal yöntemini oluşturur.

Yani sanal işlev için oluşan bir arama var. Bu çok hızlı-zamanında olacak o kadar ağır optimize edilmiştir.

Erken bağlanmış

  • Derleyici, çağrılan işlev derleme zamanında nerede olacağını hesaplayabilir.
  • Derleyici fonksiyonu var ve çalışma zamanında çağrılabilir olacak erken garanti edemez program kodunun herhangi bitmeden önce).
  • Derleyici işlev bağımsız değişkenleri doğru sayıda alır ve doğru türde olduğunu garanti eder. Ayrıca, dönüş değeri doğru türde olup olmadığını kontrol eder.

Geç bağlama

  • Arama artık ofset basit bir hesaplama değil çünkü, genellikle yapılacak metin karşılaştırmaları var alacak.
  • Hedef işlev olmayabilir.
  • Hedef işlev bağımsız değişken olarak geçirilen kabul etmeyebilir ve yanlış türde bir dönüş değeri olabilir.
  • Bazı uygulamaları ile, hedef yöntem aslında çalışma zamanında değiştirebilirsiniz. Yani, arama farklı bir fonksiyon yürütmek olabilir. Bu Ruby dili olur bence, program çalışırken bir nesne üzerine yeni bir yöntem tanımlayabilirsiniz. Geç bağlama işlev çağrıları bir yöntem için yeni bir geçersiz aramak yerine mevcut temel yöntemini aramayı başlatmak için izin verir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • Kamikazeepanda

    Kamikazeepan

    5 ŞUBAT 2006
  • Living Waters

    Living Water

    9 AĞUSTOS 2006