SORU
7 Aralık 2011, ÇARŞAMBA


Bu nesne-ömrü uzatan-kapatma C# derleyici hata?

Bazı karşılaştığımda kapatma imkanı (meşru) question bir nesne-ömür uzatılması cevap vermiştimson dereceC bölümünde kod-gen meraklı# derleyicisi (eğer sorun buysa tabii 4.0).

Bulabildiğim en kısa yeniden oluşturma şudur:

  1. Bir arama sırasında bir yerel yakalayan bir lambda oluşturunstatikkapsayan tür yöntemi.
  2. Bir temsilci-başvuru üretilen atayınörnekiçeren nesnenin alanı.

Sonuç: derleyici kapatma-nesne başvuran için bir nedeni olmadığını ne zaman lambda, oluşturulan nesne 'iç' temsilci bir hedef . bir oluşturur ^em>statikyöntem ve lambda-oluşturma-object üyeleri (ve değil) temsilci çalıştırıldığında etkilenmene gerek yok örneği. Etkili, derleyici programcı sebepsiz this yakalamış gibi davranıyor.

class Foo
{
    private Action _field;

    public void InstanceMethod()
    {
        var capturedVariable = Math.Pow(42, 1);

        _field = () => StaticMethod(capturedVariable);
    }

    private static void StaticMethod(double arg) { }
}

Bir sürümde oluşturulan kodu oluştur (decompiled 'basit' C#) bu gibi görünüyor:

public void InstanceMethod()
{

    <>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1();

    CS$<>8__locals2.<>4__this = this; // What's this doing here?

    CS$<>8__locals2.capturedVariable = Math.Pow(42.0, 1.0);
    this._field = new Action(CS$<>8__locals2.<InstanceMethod>b__0);
}

[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
    // Fields
    public Foo <>4__this; // Never read, only written to.
    public double capturedVariable;

    // Methods
    public void <InstanceMethod>b__0()
    {
        Foo.StaticMethod(this.capturedVariable);
    }
}

Kapatma nesne <>4__this alan bir nesne başvurusu ile doldurulur ama asla okunur (nedeni yok) inceleyin.

Burada neler oluyor? Dil belirtimi için izin veriyor mu? Bu derleyici bir hata / gariplik ya da iyi bir nedeni açıkça atladığım () referans kapatılması için obje var mı? Bu beni tedirgin çünkü bu gibi tarifi için kapatma-mutlu programcılar (benim gibi) farkında olmadan tanıtmak garip bir bellek sızıntısı (hayal temsilci kullanılmış olarak bir olay işleyicisi) programları.

CEVAP
14 Aralık 2011, ÇARŞAMBA


Emin bir böcek gibi görünüyor. Dikkatimi çektiğiniz için teşekkürler. Bunu araştıracağım. Zaten bulundu ve çözüldü mümkündür.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ammine Getahun

    Ammine Getah

    21 HAZİRAN 2011
  • ODN

    ODN

    26 Kasım 2006
  • pilslajt

    pilslajt

    20 HAZİRAN 2008