SORU
3 Kasım 2011, PERŞEMBE


C boks Geçtiği#

Hangi boks C oluşuyor durumlar toplamak için çalışıyorum#:

  • System.Object türü herhangi bir değer türü dönüştürme:

    struct S { }
    object box = new S();
    
  • System.ValueType türü herhangi bir değer türü dönüştürme:

    struct S { }
    System.ValueType box = new S();
    
  • System.Enum türü için herhangi bir numaralandırma türü dönüştürme:

    enum E { A }
    System.Enum box = E.A;
    
  • Herhangi bir değer arayüzü referans türü dönüştürme:

    interface I { }
    struct S : I { }
    I box = new S();
    
  • Sabit olmayan bir değer türleri C# string birleştirme:

    char c = F();
    string s1 = "char value will box"   c;
    
  • Değer türü örneği yönteminden temsilci oluşturma:

    struct S { public void M() {} }
    Action box = new S().M;
    
  • Değer türleri üzerinde olmayan sanal yöntemleri geçersiz arama:

    enum E { A }
    E.A.GetHashCode();
    
  • object isteğe bağlı parametreler tip tip varsayılan değerler değer:

    void M([Optional, DefaultParameterValue(42)] object o);
    M(); // boxing at call-site
    
  • null sınırlandırılmamış genel bir değer türü kontrolü:

    bool M<T>(T t) => t != null;
    string M<T>(T t) => t?.ToString(); // ?. checks for null
    M(42);
    
  • Tip test değeri sınırlanmamış yais/as operatörleri struct genel tür:

    bool M<T>(T t) => t is int;
    int? M<T>(T t) => t as int?;
    IEquatable<T> M<T>(T t) => t as IEquatable<T>;
    M(42);
    

Biliyorum ki, belki gizli, boks herhangi bir durum var mı?

CEVAP
3 Kasım 2011, PERŞEMBE


Bu harika bir soru!

Bir değer türü için bir başvuru ihtiyacımız var . tam bir sebepten oluşur boks: . Her şeyi yazmışsınız bu kural içine düşüyor.

Nesne başvurusu bir tür olduğundan örneğin, bir değer nesne türü için döküm boks neden olan bir değer türü için bir başvuru gerektirir.

İstiyorsanız, liste her olası senaryo, sen de kapsamalıdır türevleri gibi dönen bir değer türü bir yöntem döndüren bir nesne veya arabirim türü, çünkü bu otomatik olarak atmalarını değer türü için nesne / interface.

Bu arada, dize birleştirme dava astutely tespit de nesneye döküm türemiştir. Operatör geçirmek, değer türü bir nesne kabul eden bir dize herhangi bir parametre yöntemi çağrısı, derleyici tarafından çevrilmiş, nesneye döküm ve dolayısıyla boks oluşur.

Yıllar içinde her zaman listenin ve hatırlamak için uzun ve zor olduğu için geliştiriciler boks için tek nedeni (yukarıda belirtilen) hatırlamak yerine her durumda ezberlemek için tavsiye ettim. Bu da IL derleyici bizim C için kod oluşturur ne anlama teşvik# (örneğin bir ara Dize.dize verir kodu Herhangi bir parametre). Senin derleyici oluşturur ve eğer boks ederse şüphe'e, IL Çözücü (ILDASM.exe) kullanabilirsiniz. Genellikle kutusu işlem kodu (boks IL kutusu kodu, daha fazla detay içermiyor olsa bile ortaya çıkabilir zaman sadece tek bir dava altında var) için bakmak gerekir.

Ama bazı boks olaylar daha az belirgin katılıyorum. Onlardan biri sıraladı: bir değer girin. olmayan geçersiz bir yöntem arıyorum Aslında, bu daha az belirgin bir başka nedeni: ne zaman onay IL kodu görmüyorsun kutusu kodu, ancak bu kısıtlama, işlem kodu, bu yüzden bile bu IL çok belli olmuyor bu boks olur! Daha da uzun hale gelen bu cevap önlemek için neden tam ayrıntısına girmeyeceğim...

Daha az belirgin boks için başka bir yapı temel sınıf yöntemi çağırmak. Örnek:

struct MyValType
{
    public override string ToString()
    {
        return base.ToString();
    }
}

Burada Olabilirdi geçersiz kılınır, MyValType üzerinde Olabilirdi demeyi boks üretmek değil. Ancak, bu uygulama boks (IL kontrol edin!) neden olan temel Sağlar ve aramalar.

Bu arada, çok açık olmayan bu iki boks senaryolar da tek kural yukarıda türetmek. Bir yöntem bir değer türü temel sınıf çağrıldığında, bir şey olmalıbuanahtar kelime bakın. Bir değer türü temel sınıf olduğu için her zaman bir referans türübuanahtar kelime bir başvuru türü ile ilgili olmalıdır ve bir değer türü için bir başvuru ihtiyacımız var ve boks tek kuralı nedeniyle oluşur.

Burada benim online bölümüne doğrudan bir bağlantı .Ayrıntılı boks anlatılır NET ders: http://motti.me/mq

Eğer sadece daha gelişmiş boks senaryoları ilgilenen varsa işte orada doğrudan bir bağlantı linki yukarıda daha temel şeyler anlatılır bir kez de orada olacak olsa da): http://motti.me/mu

Bu yardımcı olur umarım!

Motti

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Harvest: Greg Laurie

    Harvest: Gre

    6 HAZİRAN 2006
  • HBO

    HBO

    17 Mayıs 2006