SORU
17 Ocak 2012, Salı


C için bir sebep mi'#; dosyalarda grup olarak değişken ler yeniden?

C lambda ifadeleri veya anonim yöntemlerini kullanırken#, dikkatli olmak zorundayızmodifiye kapatılması için erişimhatadır. Örneğin:

foreach (var s in strings)
{
   query = query.Where(i => i.Prop == s); // access to modified closure
   ...
}

Modifiye kapanması nedeniyle yukarıdaki kodu sorgulama Where tümceleri s son değere göre neden olur.

here, açıklandığı üzere bu s değişken foreach döngü yukarıda bildirilen derleyici böyle çevrilmiş olduğundan olur:

string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}

böyle: yerine

while (enumerator.MoveNext())
{
   string s;
   s = enumerator.Current;
   ...
}

Gösterilen here, yok performans avantajları için ilan değişkeni döngü dışında, normal şartlar altında tek sebebi düşündüğüm için yapıyorum bu ise plan kullanmak için değişken kapsamı dışında kalan döngü:

string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}
var finalString = s;

Ancak değişkenler foreach bir döngü içinde tanımlanan döngünün dışında kullanılamaz:

foreach(string s in strings)
{
}
var finalString = s; // won't work: you're outside the scope.

Derleyici algılayabileceği fayda üretirken genellikle zor ve hata ayıklama için bir hata eğilimli bir değişken bildirir, o kadar.

Orada senin yapabileceğin bir şey foreach döngü bu şekilde olmazsa onlar derlenmiş bir iç kapsamlı değişken, yoksa bu sadece rasgele bir seçim oldu yapmadan önce adsız yöntem ve lambda ifadeleri mevcut ya da yaygın, ve hangi bulunmadı revize zamandan beri?

CEVAP
17 Ocak 2012, Salı


Derleyici algılayabileceği fayda üretirken genellikle zor ve hata ayıklama için bir hata eğilimli bir değişkeni bildirir.

Eleştiri tamamen haklı.

Ben ayrıntılı olarak bu sorunu burada tartışmak:

Closing over the loop variable considered harmful

Eğer iç kapsamlı bir değişken ile derlenmiş olsaydı edemeyeceği foreach döngü bu şekilde yapabileceğiniz bir şey var mı? ya da bu sadece adsız yöntem ve lambda ifadeleri o zamandan beri revize edilmemiş mevcut ya da yaygın, ve daha önce yapılan rastgele bir seçim mi?

İkincisi. # 1.0 C belirtimi aslında döngü değişken gözlemlenebilir bir fark yarattı içi veya döngü vücut dışında, olup olmadığını söylemedi. Kapatma anlambilim C# 2.0, döngü dışında döngü değişkeni verildi seçiminde sunulan, "" döngü. tutarlı ile

Adil tüm bu kararından pişman olmadığını söyleyebiliriz sanırım. Bu en kötü biri, "" C# ve . frikiklerinden ^strong>kırılma değiştirmek düzeltmek için alacağız.C# 5 foreach döngü değişkeni mantıklı olacaktıriçindedöngü, ve bu nedenle kapatma vücut yeni bir kopyasını her zaman alırsınız.

for döngü değiştirilmeyecek, değişiklik olmayacak "geri taşıdık" C önceki sürümlerine#. Bu nedenle bu deyimi kullanırken dikkatli olmaya devam etmelisiniz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BiGSH0TROB

    BiGSH0TROB

    7 NİSAN 2011
  • kindlechatmail

    kindlechatma

    25 AĞUSTOS 2010
  • TSE

    TSE

    12 Kasım 2012