Dosyalarda grup değişken için erişim kapatma uyarısı
Aşağıdaki uyarıyı alıyorum:
Kapatılması dosyalarda grup değişken için erişim. Mayıs derleyici farklı sürümleri ile derlenmiş, farklı davranışları var.
Bu gibi editörüm görünüyor
Bu uyarı düzeltmek nasıl biliyorum, ama neden olsun ki biliyorum bu uyarı istiyorum?
Bu konuda "CLR" sürüm? İlgili "IL"?
CEVAP
Bu uyarı iki bölümü vardır. İlk
Kapatılması dosyalarda grup değişken için erişim
...geçersiz karşı sezgisel ilk bakışta önemlidir ama tek başına değildir. Ayrıca çok zor değil. (Ben link aşağıdaki makale bu açıklar o kadar ki,"".) zararlı
Sorgunuzu, bölümünden olduğunuz kod temelde ne C genişletilmiş bir formu olduğunu belirterek, al# derleyicisi C# 5 önce () foreach
oluşturur1:
[Yok] neden [şudur] geçerli değil anlayın:
string s; while (enumerator.MoveNext()) { s = enumerator.Current; ...
Peki, sözdizimsel olarak geçerli. Ve eğer tüm döngü içinde gidiyor eğer kullanıyordeğers
Her şey iyi olur o zaman. Ama s
üzerinde kapanış mantıksız davranışlara yol açacaktır. Aşağıdaki kodu bir göz atın:
var countingActions = new List<Action>();
var numbers = from n in Enumerable.Range(1, 5)
select n.ToString(CultureInfo.InvariantCulture);
using (var enumerator = numbers.GetEnumerator())
{
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
Console.WriteLine("Creating an action where s == {0}", s);
Action action = () => Console.WriteLine("s == {0}", s);
countingActions.Add(action);
}
}
Eğer bu kodu çalıştırırsanız, aşağıdaki çıktıyı konsol: var
Creating an action where s == 1
Creating an action where s == 2
Creating an action where s == 3
Creating an action where s == 4
Creating an action where s == 5
Bu ne bekliyordunuz.
Muhtemelen beklemeyin bir şey görmek için aşağıdaki kodu çalıştırınhemen sonrayukarıdaki kod:
foreach (var action in countingActions)
action();
Aşağıdaki konsol çıktısını alırsınız:
s == 5
s == 5
s == 5
s == 5
s == 5
Neden? Hepsi aynı işi görüyor bu beş fonksiyonları yarattık, çünkü: baskı s
değeri üzerine kapattık. Gerçekte, aynı işlevi onlar ("s
", "s
", "s
"...)Yazdır. Yazdır
Hangi tam olarak ne biz onlardan, onlar kullanmak için gidiyoruz noktasında: yazdırma s
değeri. Eğer s
son bilinen değeri bakarsanız 5
olduğunu göreceksiniz. Konsola s == 5
beş kez bastık.
İstediğimiz tam olarak, ama muhtemelen istediğimiz şey değil.
Uyarı ikinci bölümü...
Mayıs derleyici farklı sürümleri ile derlenmiş, farklı davranışları var.
...ne olduğudur. Starting with C# 5, the compiler generates different code that "prevents" this from happening via foreach
.
Böylece aşağıdaki kodu derleyici farklı sürümleri altında farklı sonuçlar verir
foreach (var n in numbers)
{
Action action = () => Console.WriteLine("n == {0}", n);
countingActions.Add(action);
}
Sonuç olarak, aynı zamanda R üretecek# uyarı :)
Benim ilk kod parçası yukarıda olacak sergi aynı davranışı tüm sürümleri derleyici yana değilim kullanma foreach
(yerine koydum genişletilmiş çıkış öncesi C# 5 Derleyiciler).
Bunun için CLR versiyonu mu?
Burada ne sorduğunuzu tam olarak emin değilim.
Eric Lippert sonrası değişiklik olur "diyor C# 5". Yani tahminen hedef var .4.5 veya daha yeni bir davranış, ve eski davranış her şeyden önce# 5 veya daha yeni bir C derleyici ile NET.
Ama açık olalım, derleyici bir işlev değil .NET çatısı sürüm.
IL ile ilgisi var mı?
Farklı kod farklı IL bu anlamda İL için oluşturulan sonuçları var bu yüzden üretir.
1foreach
bir çok daha sık yorum yayınladığınızı kod yapısı. Bu sorun genellikle manuel sayım ile foreach
, kullanımı ile ortaya çıkar. Bu C foreach
# 5 değişiklikleri bu sorunu önlemek yardımcı, ama tamamen değil.
C için bir sebep mi'#; dosyalarda ...
.Döngü daha hızlı çalışır NET,' v...
Nasıl dosyalarda grup dizini bulmak iç...
'' Paralel devam etmek için ...
nasıl Javascript dosyalarda grup durdu...