SORU
3 AĞUSTOS 2009, PAZARTESİ


Neden't yapılar kalıtım desteklemez?

Bu yapılar biliyorum .NET miras, ancak onun değil tam olarak net bir destek yoknedenbu şekilde sınırlıdır.

Ne teknik nedeni, diğer yapılar devralmasını gelen yapılar engeller?

CEVAP
3 AĞUSTOS 2009, PAZARTESİ


Değer türleri devralma destek sebebinin diziler yüzünden.

Sorun, performans ve GC nedenlerle, değer türleri, dizi depolanan"". satır içi Örneğin, eğer FooType başvuru ise, 11 new FooType[10] {...}, verilen nesneleri yönetilen yığın (dizi, ve her tür örneğin 10) oluşturulacak. FooType yerine bir değer türü, yalnızca bir örneği oluşturulur üzerinde yönetilen yığın ... dizinin kendisi (her dizi değeri olacak saklı "satır içi" dizisi).

Şimdi, değer türleri ile miras vardı sanırım. "Satır içi depolama" diziler davranış, Kötü Şeyler görülebilir in C gibi her şey. yukarıdaki ile birlikte

Bu sözde düşünün C# kod:

struct Base
{
    public int A;
}

struct Derived : Base
{
    public int B;
}

void Square(Base[] values)
{
  for (int i = 0; i < values.Length;   i)
      values [i].A *= 2;
}

Derived[] v = new Derived[2];
Square (v);

Normal dönüşüm kuralları, Derived[] Cabrio Base[] (iyi yada kötü) bir s/yapı/sınıf/g yukarıdaki örnek olacak derlemek ve çalıştırmak beklendiği gibi, bir sorun yok. Ama Base Derived değer türleri vardır, ve mağaza içi değerleri diziler, o zaman bir sorunumuz var.

Bir sorunumuz var, çünkü Square() haberi yok Derived bunu kullanmak sadece işaretçi aritmetiği erişim her elemanın dizi, artan bir sabit tutar (sizeof(A)). Kurul belli belirsiz gibi olacaktır:

for (int i = 0; i < values.Length;   i)
{
    A* value = (A*) (((char*) values)   i * sizeof(A));
    value->A *= 2;
}

(Evet, iğrenç bir montaj ama noktadan-derleme zamanı sabitleri, türetilmiş bir tür kullanılan herhangi bir bilgi olmadan da biliniyor dizisi artış olur.)

Eğer bu gerçekten olduysa, bellek bozulması sorunları olurdu. Özellikle, Square(), values[1].A*=2 içinde . ben^>aslındavalues[0].B değiştirme!

Hata ayıklamak için deneyinBU!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • John Lynn

    John Lynn

    8 Ocak 2010
  • MrRandomSong

    MrRandomSong

    29 Kasım 2009
  • Rootjunky.com

    Rootjunky.co

    22 EKİM 2011