نویسنده با یک اشکال عجیب در سیستم رزرو اتاق کنفرانس خود در Blazor مواجه شد، جایی که تمام دکمههای زمانبندی به جای زمان واقعی، مقدار 24:00 را در کنسول نمایش میدادند. پس از بررسیهای فراوان، متوجه شد که علت این مشکل، Capture Closure است. در این حالت، لامبداها متغیرها را به جای مقادیرشان Capture میکنند. هنگامی که حلقه به پایان میرسد، متغیر hour مقدار 24 را دارد و تمام هندلرها به این مقدار اشاره میکنند. نویسنده با استفاده از foreach و Enumerable.Range مشکل را حل کرد. راه حلهای جایگزین شامل ایجاد کپی محلی از متغیر، استفاده از متد با پارامتر و استفاده از @key برای اجبار به رندر مجدد است. این مشکل به دلیل ماهیت Blazor، که از لامبداها برای هندلرها استفاده میکند و اجرای غیرهمزمان دارد، بیشتر رخ میدهد. این مقاله همچنین به اهمیت درک Capture Closure در زبانهای برنامهنویسی مختلف و ارائه نکات اشکالزدایی اشاره میکند.
مشاهده مطلب اصلی