Mohsen Farokhi - محسن فرخی
Mohsen Farokhi - محسن فرخی
خواندن ۲ دقیقه·۴ سال پیش

تفاوت Value type و Reference type

در یک برنامه دو نوع حافظه Stack و Managed Heap وجود دارد. stack حافظه کمتری دارد اما سرعت کار کردن با آن بالاست و managed heap حافظه بیشتری دارد و سرعت آن یک مقدار پایین تر است.

تفاوت Value type و Reference type
تفاوت Value type و Reference type


وقتی یک متغیر از نوع value type تعریف می کنیم، قسمتی از حافظه stack گرفته می شود و مقدار آن متغیر نیز در stack ذخیره می شود. برای مثال وقتی یک متغیر از نوع int 32 تعریف می کنیم، چهار بایت از حافظه stack گرفته می شود و مقدار آن نیز در stack نگهداری می شود. اما وقتی یک reference type تعریف می کنیم، یک قسمت از حافظه stack گرفته می شود که داخل آن یک آدرس نگهداری می شود و این آدرس به قسمتی از managed heap اشاره می کند. مقدار آن نیز در managed heap نگهداری می شود.

در نتیجه value typeها در stack تعریف و نگهداری می شوند و برای reference typeها، آدرس در stack و مقدار در managed heap نگهداری می شود.

یکی از امکاناتی که دات نت در اختیار ما قرار می دهد مدیریت حافظه از طریق garbage collector است. به این صورت که در managed heap متغیرها را بررسی می کند و اگر به ازای آنها در stack آدرسی وجود نداشته باشد حافظه را آزاد می کند.

انواعی که در سی شارپ به عنوان value type در نظر گرفته می شوند عبارتند از:

انواع عددی:

sbyte, short, int, long

انواع اعشاری:

float, double, decimal

انواع داده های دو وضعیتی که true و false می باشد و بعد از آن کاراکترها هستند.

در مقابل reference typeهای پیش فرض سی شارپ که اولین آن ها object می باشد. تمام کلاس هایی که در سی شارپ تعریف می کنیم از یک کلاس به نام object ارث بری می کنند.

یکی دیگر از reference typeهای پرکاربرد، رشته ها می باشند که به کمک کلمه کلیدی string تعریف می شوند. اصلاحا به آن ها immutable گفته می شود. به متغیرهایی که مقدار آن ها می تواند تغییر کنند متغیرهای mutable گفته می شود. اما در مقابل متغیرهایی هستند که اگر بخواهیم مقدار آن ها را عوض کنیم باید ماهیت آن ها را عوض کنیم. به این نوع متغیرها immutable گفته می شود. متغیرها از نوع رشته نیز یکی از آنها می باشد.

برای مثال وقتی یک متغیر string تعریف می کنیم، آدرس آن در stack و مقدار آن در heap نگهداری می شود. اگر من بخواهم مقدار متغیر تعریف شده را تغییر دهم، یک خانه جدید در heap ایجاد می شود و مقدار جدید را نگهداری می کند و آدرس قبل در stack به مقدار جدید اشاره می کند. بنابراین یک متغیر جدید ایجاد می شود و مقدار جدید در آن قرار می گیرد.

پایان

value typeReference typeسی شارپمحسن فرخی
شاید از این پست‌ها خوشتان بیاید