সি # তে ল্যাম্বদা এক্সপ্রেশন বা বেনামে পদ্ধতিগুলি ব্যবহার করার সময়, আমাদের সংশোধিত ক্লোজার ফলফেসের অ্যাক্সেস সম্পর্কে সতর্ক থাকতে হবে । উদাহরণ স্বরূপ:
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লুপগুলি নিয়ে আপনি এমনভাবে কিছু করতে পারেন যা আপনি যদি কোনও অভ্যন্তরীণ-স্কোপযুক্ত ভেরিয়েবল সংকলন করেন তবে আপনি এটি করতে পারতেন না বা এটি কেবল একটি স্বেচ্ছাসেবী পছন্দ যা বেনাম পদ্ধতি এবং ল্যাম্বডা এক্সপ্রেশন উপলব্ধ বা প্রচলিত হওয়ার আগে তৈরি হয়েছিল এবং যা কোন অভ্যাস ছিল না এর পর থেকে সংশোধন করা হচ্ছে না?
foreachবরং লামদা এক্সপ্রেশন নিয়ে কথা বলছে যার ফলশ্রুতিতে ওপি দেখায় একই রকম কোড ...
String s; foreach (s in strings) { ... }?