SORU
29 Kasım 2012, PERŞEMBE


Neden ReSharper söyle&; örtülü olarak yakalanan kapatma" quot;?

Aşağıdaki kodu var:

public double CalculateDailyProjectPullForceMax(DateTime date, string start = null, string end = null)
{
    Log("Calculating Daily Pull Force Max...");

    var pullForceList = start == null
                             ? _pullForce.Where((t, i) => _date[i] == date).ToList() // implicitly captured closure: end, start
                             : _pullForce.Where(
                                 (t, i) => _date[i] == date && DateTime.Compare(_time[i], DateTime.Parse(start)) > 0 && 
                                           DateTime.Compare(_time[i], DateTime.Parse(end)) < 0).ToList();

    _pullForceDailyMax = Math.Round(pullForceList.Max(), 2, MidpointRounding.AwayFromZero);

    return _pullForceDailyMax;
}

Şimdi, ReSharper bir değişiklik önerisini bu hat üzerinde bir yorum ekledim. Yoksa neden değiştirilmesi gerekir. implicitly captured closure: end, start

CEVAP
5 NİSAN 2013, Cuma


Uyarı end start Bu yöntemin Lambda olarak hayatta kalmak değişkenleri hayatta kalmak olduğunu söyler.

Kısa örnek bir göz atın

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    int i = 0;
    Random g = new Random();
    this.button1.Click  = (sender, args) => this.label1.Text = i  .ToString();
    this.button2.Click  = (sender, args) => this.label1.Text = (g.Next()   i).ToString();
}

"Ayrı olarak ele kapatılması: g" ilk lambda uyarı. bir olsun g garbage collected ilk lambda kullanımda olduğu sürece edilemez olduğunu söylüyor.

Derleyici her iki lambda ifadeleri için bir sınıf oluşturur ve lambda ifadeleri kullanılan bu sınıfta tüm değişkenleri koyar.

Yani benim örnekte g i benim delege yürütme için aynı seviyede tutulur. Eğer g ağır bir nesne ile bir çok kaynakları geride, çöp toplayıcı olamaz geri almak için başvuru bu sınıf hala hayatta olduğu sürece herhangi bir lambda ifadeleri kullanılıyor. Bu potansiyel bir bellek sızıntısı olduğunu ve R için neden bu kadar# uyarı.

@splintor C# anonim yöntemler her zaman bunu önlemek için iki yol vardır yöntem başına bir sınıf içinde saklanır:

  1. İsimsiz bir yerine bir örnek yöntemi kullanın.

  2. İki yöntem içine lambda ifadeleri oluşturma bölünmüş.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • We've moved!

    We've moved!

    7 Ocak 2008
  • infiniTuts

    infiniTuts

    18 Ocak 2012
  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010