C # හි ලැම්බඩා ප්රකාශන හෝ නිර්නාමික ක්රම භාවිතා කරන විට, නවීකරණය කරන ලද වසා දැමීමේ වළල්ලට ප්රවේශ වීම ගැන අප සැලකිලිමත් විය යුතුය . උදාහරණයක් වශයෙන්:
foreach (var s in strings)
{
query = query.Where(i => i.Prop == s); // access to modified closure
...
}
නවීකරණය කරන ලද වසා දැමීම හේතුවෙන්, ඉහත කේතය මඟින් Where
විමසුමේ ඇති සියලුම වගන්තිවල අවසාන අගය මත පදනම් වේ s
.
ලෙස පැහැදිලි මෙතන , මේ සිදු වන නිසා s
විචල්ය දී ප්රකාශයට පත් කරන foreach
සම්පාදකවරයා මේ වගේ පරිවර්ථනය කර ඇත ඉහත පුඩුවක්:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
මේ වෙනුවට:
while (enumerator.MoveNext())
{
string s;
s = enumerator.Current;
...
}
මෙහි පෙන්වා දී ඇති පරිදි , ලූපයෙන් පිටත විචල්යයක් ප්රකාශ කිරීමේ කාර්ය සාධන වාසි නොමැති අතර සාමාන්ය තත්වයන් යටතේ මෙය කිරීමට මට සිතිය හැකි එකම හේතුව වන්නේ ඔබ ලූපයේ විෂය පථයෙන් පිටත විචල්යය භාවිතා කිරීමට අදහස් කරන්නේ නම්:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
var finalString = s;
කෙසේ වෙතත්, ලූපයක අර්ථ දක්වා ඇති විචල්යයන් ලූපයෙන් foreach
පිටත භාවිතා කළ නොහැක:
foreach(string s in strings)
{
}
var finalString = s; // won't work: you're outside the scope.
එබැවින් සම්පාදකයා විසින් විචල්යය ප්රකාශයට පත් කරනුයේ එය බොහෝ විට සොයාගත හැකි හා නිදොස්කරණය කිරීමට අපහසු වන දෝෂයකට බෙහෙවින් නැඹුරු වන අතර කිසිදු ප්රතිලාභයක් නොලැබෙන බැවිනි.
ඔබ සමඟ කළ හැකි යමක් තිබේද foreach
ඔබ ඔවුන් අභ්යන්තර-scoped විචල්ය සමඟ සම්පාදනය නොහැකි නම්, බව මේ ආකාරයට වළළු, හෝ මෙම නිර්නාමික ක්රම සහ ලැම්ඩා ප්රකාශන ලබා ගත හැකි හෝ පොදු විය පෙර සිදු වූ බව පමණක් හිතුවක්කාරී තේරීම වන අතර, වන hasn එතැන් සිට සංශෝධනය කර නැද්ද?
foreach
ලැම්ඩා ප්රකාශන ගැන නොවන අතර OP පෙන්වා ඇති ආකාරයට සමාන කේතයක් ඇතිවේ ...
String s; foreach (s in strings) { ... }
?