যেহেতু এখানে কেউ সরাসরি ইসিএমএ -৩৩৪ উদ্ধৃত হয়নি :
10.4.4.10 বিবৃতি জন্য
ফর্মের একটি বিবৃতি জন্য চিরকালীন নিয়োগ পরীক্ষা করা:
for (for-initializer; for-condition; for-iterator) embedded-statement
বিবৃতি লিখিত ছিল যেমন সম্পন্ন করা হয়:
{
for-initializer;
while (for-condition) {
embedded-statement;
LLoop: for-iterator;
}
}
অনুমানে আরও,
12.16.6.3 স্থানীয় ভেরিয়েবল ইনস্ট্যান্টেশন
যখন স্থানীয় প্রয়োগটি ভেরিয়েবলের স্কোপে প্রবেশ করে তখন তা তাত্ক্ষণিক বলে বিবেচিত হয়।
[উদাহরণস্বরূপ: উদাহরণস্বরূপ, যখন নিম্নলিখিত পদ্ধতিটি চালু করা হয়, স্থানীয় ভেরিয়েবলটি x
তাত্ক্ষণিকভাবে শুরু করা হয় এবং তিনবার শুরু করা হয় - একবার লুপের প্রতিটি পুনরাবৃত্তির জন্য।
static void F() {
for (int i = 0; i < 3; i++) {
int x = i * 2 + 1;
...
}
}
যাইহোক, x
লুপের ঘোষণাপত্রের বাইরে যাওয়ার ফলে একক তাত্ক্ষণিক ফলাফল হয় x
:
static void F() {
int x;
for (int i = 0; i < 3; i++) {
x = i * 2 + 1;
...
}
}
শেষ উদাহরণ]
যখন ধরা পড়ে না, স্থানীয় ভেরিয়েবলটি প্রায়শই ইনস্ট্যান্ট করা হয় তা পর্যবেক্ষণ করার কোনও উপায় নেই — কারণ ইনস্ট্যান্টেশনের জীবনকাল বিচ্ছিন্ন, প্রতিটি তাত্ক্ষণিকভাবে কেবল একই স্টোরেজ অবস্থানটি ব্যবহার করা সম্ভব। যাইহোক, যখন কোনও বেনামী ফাংশন স্থানীয় ভেরিয়েবল ক্যাপচার করে তখন ইনস্ট্যান্টেশনের প্রভাবগুলি সুস্পষ্ট হয়ে যায়।
[উদাহরণ: উদাহরণ
using System;
delegate void D();
class Test{
static D[] F() {
D[] result = new D[3];
for (int i = 0; i < 3; i++) {
int x = i * 2 + 1;
result[i] = () => { Console.WriteLine(x); };
}
return result;
}
static void Main() {
foreach (D d in F()) d();
}
}
আউটপুট উত্পাদন করে:
1
3
5
যাইহোক, যখন ঘোষণাটি x
লুপের বাইরে সরানো হয়:
static D[] F() {
D[] result = new D[3];
int x;
for (int i = 0; i < 3; i++) {
x = i * 2 + 1;
result[i] = () => { Console.WriteLine(x); };
}
return result;
}
আউটপুটটি হ'ল:
5
5
5
নোট করুন যে সংকলকটি তিনটি ইনস্ট্যান্টেশনকে একক প্রতিনিধি উদাহরণে (.711.7.2) অনুকূলকরণের জন্য অনুমোদিত (তবে প্রয়োজনীয় নয়)।
যদি কোনও for-loop একটি পুনরাবৃত্তি ভেরিয়েবল ঘোষণা করে তবে সেই পরিবর্তনশীলটি নিজেই লুপের বাইরে ঘোষিত বলে মনে করা হয়। [উদাহরণ: এইভাবে, যদি পুনরাবৃত্তির পরিবর্তনশীল নিজেই ক্যাপচারের জন্য উদাহরণটি পরিবর্তন করা হয়:
static D[] F() {
D[] result = new D[3];
for (int i = 0; i < 3; i++) {
result[i] = () => { Console.WriteLine(i); };
}
return result;
}
পুনরাবৃত্তি ভেরিয়েবলের কেবল একটি উদাহরণ ধরা পড়ে, যা আউটপুট উত্পাদন করে:
3
3
3
শেষ উদাহরণ]
হ্যাঁ, আমি অনুমান করি যে এটি উল্লেখ করা উচিত যে সি ++ এ এই সমস্যাটি দেখা দেয় না কারণ আপনি যদি ভেরিয়েবলটি মান বা রেফারেন্সের মাধ্যমে ক্যাপচার করা হয় তবে আপনি চয়ন করতে পারেন (দেখুন: ল্যাম্বদা ক্যাপচার )।