SORU
22 HAZİRAN 2012, Cuma


Nasıl C diziler * kısmen IList<T>?uygulamak

Bildiğiniz gibi, C'de diziler * diğer arayüzler arasında IList<T>, uygulamak. Bir şekilde de olsa, alenen IList<T> Count özelliği uygulama olmadan bunu yapıyorlar! Diziler sadece Uzunluğu bir özelliği var.

Bu C bariz bir örnek.NET arayüzü uygulaması hakkında kendi kurallarını çiğnemiştir ya da ben bir şey eksik?

CEVAP
22 HAZİRAN 2012, Cuma


Bildiğiniz gibi, C'de diziler * diğer arayüzler arasında uygulamak IList<T>,

Evet, Evet, Hayır erm, gerçekten değil. Bu Dizi sınıf için bildirim .NET 4 çerçeve

[Serializable, ComVisible(true)]
public abstract class Array : ICloneable, IList, ICollection, IEnumerable, 
                              IStructuralComparable, IStructuralEquatable
{
    // etc..
}

Sistem uygular.Koleksiyonları.Ilist,değilSistem.Koleksiyonları.Jenerik.Ilist<>. Olabilir Dizi jenerik değildir. Aynı genel IEnumerable<^ için de geçerli . ve ICollection<>arayüzleri.

Ama CLR teknik olarak bu arabirimleri uygulayan bir görüntü olurdu yani anında beton dizi türleri oluşturur. Bu ancak durum böyle değil. Örneğin: bu kodu deneyin

using System;
using System.Collections.Generic;

class Program {
    static void Main(string[] args) {
        var goodmap = typeof(Derived).GetInterfaceMap(typeof(IEnumerable<int>));
        var badmap = typeof(int[]).GetInterfaceMap(typeof(IEnumerable<int>));  // Kaboom
    }
}
abstract class Base { }
class Derived : Base, IEnumerable<int> {
    public IEnumerator<int> GetEnumerator() { return null; }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); }
}

Bu GetİnterfaceMap (beton) bir dizi için çağrı başarısız olan tip "Arayüz bulunamadı". Henüz IEnumerable<^ bir döküm . bir sorun olmadan çalışıyor.

Bu şarlatanlar bir ördek gibi yazıyor. Her değer türü bir Nesne türetir olan ValueType türeyen yanılsama yaratan yazarak aynı tür. Derleyici ve CLR hem değer türleri gibi dizi türü özel bilgi var. Derleyici IList<^ çevrim girişimi olarak görüyor . ve diyor ki "Tamam, bunu nasıl yapacağımı biliyorum".! Ve castclass IL talimat yayar. CLR ile hiçbir sorun vardır, IList<^ bir uygulama sağlamak için nasıl bilir . alttaki dizi nesne üzerinde çalışır. Yerleşik başka türlü gizli bilgi var.Sınıf, aslında bu arabirimleri uygulayan bir sarıcı SZArrayHelper.

Açıkça herkes iddiaları gibi yapmaz ki, sorduğun Sayısı özelliği bu gibi görünüyor:

    internal int get_Count<T>() {
        //! Warning: "this" is an array, not an SZArrayHelper. See comments above
        //! or you may introduce a security hole!
        T[] _this = JitHelpers.UnsafeCast<T[]>(this);
        return _this.Length;
    }

Evet, kesinlikle bu yorum diyebilirsin "kuralları çiğnemek" :) aksi halde kullanışlı bela. Ve son derece iyi gizlenmiş, SSCLİ20, paylaşılan kaynak CLR için dağıtım bu kontrol edebilirsiniz. Arama "" görmek için yazdığınız ikame gerçekleşir. IList için Eylem olarak görmek için en iyi yer clr/src/vm/array.cpp, GetActualİmplementationForArrayGenericilistmethod() yöntemi.

CLR ikame bu tür WinRT (aka Metro) için yönetilen kod yazma sağlayan CLR dil projeksiyon ne göre oldukça hafif. Herhangi bir çekirdek .NET yazın orada yerine alır. Ilist<>&;^ İVector lt için haritalar . örneğin, tamamen yönetilmeyen bir tip. Kendini değiştirme, bir COM genel türlerini desteklemiyor.

O perdenin arkasında neler olup bittiğini bir göz oldu. Ejderhalar haritanın sonunda yaşayan çok rahatsız, garip ve yabancı denizlerde olabilir. Dünyanın düz ve gerçekten yönetilen kod ne oluyor farklı bir görüntü modeli yapmak için çok yararlı olabilir. Herkesin favori cevap eşleme rahat yoldur. Çok iyi bir değer türleri (mutasyona bir yapı yok!) çalışmıyor ama bu çok gizli. Bu GetİnterfaceMap() yöntemi başarısız aklıma gelen soyutlama sadece sızıntı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FullMag

    FullMag

    15 ŞUBAT 2007
  • Major FX

    Major FX

    6 HAZİRAN 2012
  • stewmurray47

    stewmurray47

    1 Kasım 2006