نویسنده : امیر
نظرات : ۰ دیدگاه
بازدید : ۷۶۶ بازدید
تاریخ : ۰۲ آذر ۱۳۹۶

یکی از مباحث مهم زبان های برنامه نویسی بحث های منطقی آنها هستند که باید حتما به آنها توجه ویژه ای شود در این جلسه با آموزش برنامه نویسی سی شارپ قصد بررسی برخی از مباحث منطقی در زبان سی شارپ را داریم.
حتما قبل از بررسی مباحث منطقی در سی شارپ نوشته ی مطالب قبلی این دوره ی آموزشی را با هشتگ #دوره آموزشی_سی_شارپ در سایت ما را مطالعه کنید.
هنگامیکه یک متغیر تعریف میکنید، دقیقاً چه اتفاقی میافتد؟
هنگامیکه یک متغیر تعریف میکنید، قسمتی از حافظهی RAM برای این منظور اختصاص داده میشود. این قسمت از حافظه، شامل سه چیز است: نام متغیر، data type متغیر و مقدار متغیر.
با توجه به data type، متغیر شما در قسمتهای متفاوتی ذخیره میشود. دو نوع تخصیص حافظه وجود دارد که یکی stack memory و دیگری heap memory است. برای اینکه بهتر با stack و heap آشنا شوید به کد زیر و شرح آن توجه کنید:
1 2 3 4 5 6 |
public void Method1() { int x = 2; int y = 5; MyClass ob = new MyClass(); } |
در خط اول، کامپایلر مقدار کمی از حافظه stack برای این منظور اختصاص میدهد. stack مسئول پیگیری حافظهی مورد نیاز (در حال اجرا) در برنامه شما است. هنگامی که line 2 اجرا میشود، متغیر y در بالای stack ذخیره خواهد شد.
در خط ۳، متغیر ob در stack ذخیره میشود و شیءای که ساخته شده در heap قرار میگیرد.
reference ها در stack ذخیره میشوند و عبارت MyClass ob حافظه را برای یک شیء از این کلاس اشغال نمیکند. این عبارت تنها متغیر ob را در stack قرار میدهد (و به آن مقدار null میدهد) و هنگامیکه کلمهی کلیدی new اجرا میشود، شیء این کلاس در heap ذخیره خواهد شد.
هنگامیکه برنامه به انتهای متد میرسد، متغیرهایی که در stack بودند همگی پاک میشوند. اما چیزی از heap پاک نمیشود بلکه اشیای درون heap بعداً توسط garbage collector پاک خواهند شد.
چرا از stack و heap استفاده می شود؟
data type های اصلی (value types)، پیچیده و سنگین نیستند. آنها مقادیر تکی مثل int i = 5 را نگه میدارند در حالیکه object data types یا reference types پیچیدهتر و سنگینتر هستند، آنها به اشیای دیگری رجوع میکنند. به عبارت دیگر، آنها به چندین مقدار رجوع میکنند (زیرا اشیاء میتوانند شامل مقادیر زیادی از فیلد و متد و… باشند) که هرکدام از آنها باید در حافظه ذخیره شده باشد. اشیاء به dynamic memory و data type های اصلی (value types) به static memory نیاز دارند. اگر اطلاعات شما نیازمند dynamic memory باشد، در heap ذخیره میشود، اگر نیازمند static memory باشد، در stack ذخیره خواهد شد.
بررسی Value types و Reference types :
type ها تمام و کمال در stack ذخیره میشوند، یعنی هم مقدار و هم متغیر همگی یکجا هستند اما در reference type متغیر در stack است درحالیکه object در heap قرار میگیرد و متغیر و شیء به هم متصل میشوند (متغیر به شیء اشاره میکند). هنگامیکه یک شیء میسازید و reference آن را با یک reference دیگر مساوی قرار میدهید، آنگاه هر دوی این reference ها به یک شیء رجوع میکنند و تغییر هر کدام از آنها باعث تغییر شیء میشود زیرا هردو reference به یک شیء اشاره میکنند.
مبحث Boxing and Unboxing :
وقتیکه یک مقدار value type را تبدیل به reference type میکنید، در واقع اطلاعات را از stack به heap میبرید و هنگامیکه یک مقدار reference type را تبدیل به value type میکنید، اطلاعات را از heap به stack میبرید. این رفت و برگشت اطلاعات از stack به heap روی performance (کارایی، سرعت اجرا) برنامه تاثیر میگذارد. فرستادن اطلاعات از stack به heap در اصطلاح boxing و فرستادن اطلاعات از heap به stack در اصطلاح unboxing نامیده میشود.
نکته : استفاده از boxing و unboxing باعث افت performance میشود بنابراین تا آنجا که میتوانید از انجام اینکار پرهیز کنید و فقط در مواردی که واقعاً نیازمند اینکار هستید و راه دیگری نیست، از آن استفاده کنید.
Garbage Collection چیست ؟
Garbage Collection نوعی مدیریت حافظهی خودکار محسوب میشود. هربار که یک شیء میسازید، object شما در heap ذخیره میشود. تا زمانیکه فضای کافی برای ذخیرهی این اشیاء داشته باشید میتوانید شیء جدید بسازید اما همانطور که میدانید حافظه نامحدود نیست و ممکن است پر شود. بنابراین باید object های بیاستفاده، از حافظه پاک شوند تا بتوان مجدداً اشیای دیگری را در حافظه ذخیره کرد. زبان سیشارپ برای این منظور از راه حلی به اسم Garbage Collection استفاده میکند. Garbage Collection بدون اینکه برنامهنویس نیاز باشد کار خاصی انجام دهد بهصورت خودکار، اشیایی که در heap قرار دارند و به هیچ referenceای وصل نیستند را پاک میکنند. اگر میخواهید قبل از پاک شدن یک شیء توسط garbage collector کار خاصی را انجام دهید یا فقط از پاک شدن آن مطلع شوید از destructors استفاده میکنید.
برای استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.
منتظر جلسه ی بعدی دوره آموزشی سی شارپ باشید.
موفق و پیروز باشید.
پاسخی بگذارید