সি # 5 এর পূর্বে আপনাকে পূর্বাভাসের অভ্যন্তরে একটি পরিবর্তনশীল পুনরায় ঘোষণা করতে হবে - অন্যথায় এটি ভাগ করা হয়, এবং আপনার সমস্ত হ্যান্ডলারগুলি শেষ স্ট্রিংটি ব্যবহার করবে:
foreach (string list in lists)
{
string tmp = list;
Button btn = new Button();
btn.Click += new EventHandler(delegate { MessageBox.Show(tmp); });
}
তাৎপর্যপূর্ণভাবে, নোট করুন যে সি # 5 থেকে, এটি পরিবর্তিত হয়েছে এবং বিশেষত এর ক্ষেত্রেforeach
আপনার আর এটি করার দরকার নেই: প্রশ্নের কোডটি প্রত্যাশার মতো কাজ করবে।
এটি এই পরিবর্তন ব্যতীত কাজ না করার জন্য, নিম্নলিখিতটি বিবেচনা করুন:
string[] names = { "Fred", "Barney", "Betty", "Wilma" };
using (Form form = new Form())
{
foreach (string name in names)
{
Button btn = new Button();
btn.Text = name;
btn.Click += delegate
{
MessageBox.Show(form, name);
};
btn.Dock = DockStyle.Top;
form.Controls.Add(btn);
}
Application.Run(form);
}
উপরের সি # 5 এর আগে চালান , এবং প্রতিটি বোতাম একটি আলাদা নাম দেখায়, বোতামগুলি ক্লিক করে "উইলমা" চারবার দেখায়।
এটি কারণ ভাষার স্পেস (ECMA 334 v4, 15.8.4) (সি # 5 এর আগে) সংজ্ঞায়িত করেছে:
foreach (V v in x)
embedded-statement
এরপরে প্রসারিত:
{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}
নোট করুন যে ভেরিয়েবলটি v
(যা আপনার list
) লুপের বাইরে ঘোষিত হয় । সুতরাং ক্যাপচারড ভেরিয়েবলের নিয়ম অনুসারে তালিকার সমস্ত পুনরাবৃত্তি ক্যাপচারড ভেরিয়েবল ধারককে ভাগ করে দেবে।
সি # 5 এর পরে, এটি পরিবর্তন করা হয়েছে: পুনরাবৃত্তির পরিবর্তনশীল ( v
) লুপের অভ্যন্তরে স্কুপ করা হবে । আমার কাছে কোনও স্পেসিফিকেশন রেফারেন্স নেই তবে এটি মূলত:
{
E e = ((C)(x)).GetEnumerator();
try {
while (e.MoveNext()) {
V v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}
আবার সদস্যতা বাতিল; আপনি যদি সক্রিয়ভাবে কোনও বেনামী হ্যান্ডলারটি সাবস্ক্রাইব করতে চান তবে কৌশলটি হ্যান্ডলারটি নিজেই ক্যাপচার করা হবে:
EventHandler foo = delegate {...code...};
obj.SomeEvent += foo;
...
obj.SomeEvent -= foo;
তেমনি, আপনি যদি একবারের ইভেন্ট ইভেন্ট হ্যান্ডলার চান (যেমন লোড ইত্যাদি):
EventHandler bar = null; // necessary for "definite assignment"
bar = delegate {
// ... code
obj.SomeEvent -= bar;
};
obj.SomeEvent += bar;
এটি এখন স্ব-সদস্যতা ছাড়াই ;- পি