"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تلتقط تعبيرات Lambda القيمة النهائية لمتغيرات التكرار ، وكيف يمكن تجنب ذلك؟

لماذا تلتقط تعبيرات Lambda القيمة النهائية لمتغيرات التكرار ، وكيف يمكن تجنب ذلك؟

نشر في 2025-02-06
تصفح:189

Why Do Lambda Expressions Capture the Final Value of Iteration Variables, and How Can This Be Avoided?

خطر استخدام المتغيرات التكرارية في تعبيرات lambda

توفر تعبيرات Lambda طريقة موجزة لتحديد وظائف مضمّنة في حلقة. ومع ذلك ، فإن استخدام المتغيرات التكرارية مباشرة في Lambdas قد يؤدي إلى سلوك غير متوقع لاحقًا.

فخ Lambda لتكرار المتغيرات:

النظر في الكود التالي:

for (int i = 0; i  Console.WriteLine(i);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

قد يعتقد الناس أن كل Lambda سوف يطبع القيمة المقابلة لـ i. ومع ذلك ، تشترك جميع Lambdas في إشارة الالتقاط نفسها إلى I بسبب الإغلاق.

نتيجة طباعة عرضية:

عندما تخرج الحلقة ، أصبحت 10 ، وتشير جميع Lambdas الآن إلى هذه القيمة النهائية. نتيجة لذلك ، سيقوم تنفيذ Lambda بطباعة "10" عشر مرات بدلاً من التسلسل المتوقع من 0 إلى 9.

ينبع هذا السلوك من إغلاق Lambda يحافظ على إشارات إلى المتغيرات المعلنة في نطاقها ، حتى لو تم الانتهاء من الحلقة.

تجنب وطرق بديلة:

]

لحل هذه المشكلة ، وإنشاء متغير محلي في الحلقة وتعيينها بقيمة المتغير التكراري:

for (int i = 0; i  Console.WriteLine(j);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

هذا يضمن أن كل Lambda يلتقط قيمة مختلفة من J ، مما يؤدي إلى تسلسل الطباعة المتوقع.

تذكر أن استخدام المتغيرات التكرارية مباشرة في تعبيرات Lambda يمكن أن يؤدي إلى مواقف غير متوقعة تتعلق بالإغلاق. بدلاً من ذلك ، فكر في إنشاء متغيرات محلية لالتقاط القيم المطلوبة بدقة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3