حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

آشنایی با مفهوم Closure در سی شارپ

در قسمتی که راجع به Lambda Expression ها صحبت کردیم، گفتیم Lambda Expression ها ساده شده Anony mous method ها هستند. موقعیتی را فرض کنید که داخل بدنه یک Lambda Expression از یک متغیر، خارج از بدنه Lambda Expression استفاده کنیم:

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
var number = 13;

Func<int, int> f = p => p*number;

در کد بالا، متغیری تعریف شده با مقدار 13 و داخل Lambda Expression ای که تعریف کردیم، از متغیر number استفاده شده، به این کار اصطلاحاً Closure می گویند. حال فرض کنید، قبل از فراخوانی f در کد بالا، مقدار number تغییر کند:

var number = 13;

Func<int, int> f = p => p*number;

number = 5;

var result = f(2);

به کاری که بالا انجام شده، اصطلاحاً Access to modified closure می گویند. زمان استفاده از Closure ها در Lambda Expression ها، خیلی باید مراقب باشیم. این کار می تواند منجر به تغییر خروجی و مشکل در برنامه ها شود. اما بیایید نگاهی جزئی تر به نحوه اجرای کد بالا داشته باشیم.

زمانی که شما یک Lambda Expression تعریف می کنید، کامپایلر یک کلاس بدون نام ایجاد می کند که این کلاس شامل یک سازنده یا Constructor به تعداد مقادیری است که خارج از بدنه Lambda Expression تعریف شده اند. در کد بالا، Constructor کلاسی که ایجاد می شود، شامل یک پارامتر از نوع int است. همچنین یک متد داخل کلاس برای کد مربوط به Lambda Expression ایجاد می شود. کلاس ایجاد شده برای عبارت بالا، تقریباً به صورت زیر خواهد بود:

public class AnonymousClass
{
    private readonly int number;

    public AnonymousClass(int number)
    {
        this.number = number;
    }

    public int LambdaMethod(int p)
    {
        return p*number;
    }
}

زمان فرخوانی عبارت Lambda تعریف شده، کامپایلر ابتدا یک شئ از روی کلاس ایجاد شاده ساخته و اقدام به فراخوانی متد داخل آن می کند. زمان ساخت شئ، مقدار متغیرهای که خارج از بدنه Lambda تعریف شده اند، به عنوان پارامتر ورودی به سازنده پاس داده می شوند:

// var result = f(2);

var anonymousClass = new AnonymousClass(number);
var result = anonymousClass.LambdaMethod(2);

نویسنده: حسین احمدی

منبع: انجمن تخصصی فناوری اطلاعات ایران


حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ...

28 فروردین 1395 این مطلب را ارسال کرده

نظرات