Ben C # derleyici (bu önemli olursa 4.0) kısmında bazı son derece meraklı kod-gen rastladı kapanış (meşru) nesne ömrünü uzatma olasılığı hakkında bir soru cevap .
Bulabildiğim en kısa repro şudur:
- Kapsayıcı türde statik bir yöntem çağırırken yerel yakalayan bir lambda oluşturun .
- Oluşturulan temsilci başvurusunu içeren nesnenin örnek alanına atayın .
Sonuç: Derleyici, herhangi bir nedeni olmadığında lambda'yı oluşturan nesneye başvuran bir kapatma nesnesi oluşturur - temsilcinin 'iç' hedefi statik bir yöntemdir ve lambda oluşturma nesnesinin örnek üyelerinin buna gerek yoktur temsilci yürütüldüğünde dokunulmamalı (ve dokunulmamalıdır). Derleyici, programcının this
sebepsiz yakaladığı gibi davranmaktadır .
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üm derlemesinden oluşturulan kod ('daha basit' C # olarak ayrıştırılır) şöyle görünür:
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);
}
}
Bunu gözlemleyin <>4__this
Kapatma nesnesinin alanının bir nesne başvurusu ile doldurulduğunu ancak hiçbir zaman okunmadığını (bir neden yoktur).
Peki burada neler oluyor? Dil belirtimi buna izin veriyor mu? Bu bir derleyici hata / tuhaflık mı yoksa kapanışın nesneye başvurması için iyi bir neden var mı (açıkça eksik olduğum)? Bu beni endişelendiriyor çünkü bu, kapanıştan mutlu programcılar (benim gibi), istemeden garip bellek sızıntıları (delegenin bir olay işleyicisi olarak kullanılıp kullanılmadığını hayal et) tanıtmak için bir reçete gibi görünüyor.
this
.