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

  • Caina Mondo Zine

    Caina Mondo

    13 EKİM 2007
  • Matthew Pearce

    Matthew Pear

    9 AĞUSTOS 2009
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008