Erken ve geç bağlama | Netgez.com
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

  • 24 Канал

    24 КанаÐ

    5 ÅžUBAT 2006
  • BioHunta

    BioHunta

    28 Mayıs 2006
  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008