ویرگول
ورودثبت نام
Soheib Papi
Soheib Papiیک برنامه نویس علاقه مند به یادگیری.
Soheib Papi
Soheib Papi
خواندن ۱ دقیقه·۲ سال پیش

Hoisting in C#

برای درک مطلب این پست باید موارد زیر را بدانید:

  • Capture and Closure
  • lambda and anonymous methods


در سی‌شارپ، hoist کردن معمولاً به انتقال متغیرها به یک کلاس خصوصی داخلی (private class) توسط کامپایلر اشاره داره.

مفهوم hoisting در سی‌شارپ:

  1. هنگام استفاده از closures :وقتی یک متغیر محلی درون یک closure (مثل یک lambda یا متد ناشناس) استفاده می‌شه، کامپایلر این متغیر رو به یک فیلد (field) در یک کلاس داخلی منتقل می‌کنه.
    این کار به متغیر اجازه می‌ده که طول عمر بیشتری داشته باشه و همچنان بعد از پایان متد اصلی قابل‌دسترس باشه.

مثال برای hoist کردن:

کد اصلی:

csharpCopy codeFunc<int> CreateCounter() { int counter = 0; return () => counter++; }

کد کامپایل‌شده (بعد از hoisting):

csharpCopy codeprivate class Closure { public int counter; // متغیر به یک فیلد ارتقا داده شد } Func<int> CreateCounter() { var closure = new Closure(); closure.counter = 0; return () => closure.counter++; }

چرا hoisting انجام می‌شود؟

  • طول عمر متغیر: متغیرهای محلی معمولاً با پایان متد از بین می‌رن. اما اگر داخل یک closure استفاده بشن، نیاز به طول عمر بیشتری دارن.
  • دسترسی به متغیرها در lambda یا متد ناشناس: کامپایلر باید مطمئن بشه که lambda یا متد ناشناس می‌تونن به متغیرهای بیرونی‌شون دسترسی داشته باشن.

خلاصه:

در سی‌شارپ، hoisting یعنی انتقال متغیرهای محلی به یک کلاس داخلی (closure class) برای اطمینان از طول عمر و دسترسی. این اتفاق معمولاً وقتی رخ می‌ده که از lambda یا closure استفاده کنی.

۰
۰
Soheib Papi
Soheib Papi
یک برنامه نویس علاقه مند به یادگیری.
شاید از این پست‌ها خوشتان بیاید