در زبان سی شارپ زمانی که شروع میکنید به تعریف متغیر ، بسته به نوع متغیر ، محلی که در حافظه اشغال میکند و نوع ذخیره سازی و دست یابی به آن متفاوت است. به طور مثال زمانی که یک متغیر از نوع int تعریف می کنید ، این متغیر و مقدار آن به صورت مستقیم در حافظه Stack ذخیره می شوند و دسترسی ما به مقدار آن متغیر، به طور مستقیم از داخل حافظه Stack می باشد.
اما زمانی که یک شئ از یک کلاس ایجاد می کنید خانه ای برای آن شئ (متغیر از نوع کلاس را شئ یا object می گویند) در حافظه استک (Stack) در نظر گرفته می شود و شئ مربوط به آن در حافظه Heap ذخیره می شود و سپس در قسمت مربوط به متغیر در حافظه ی Stack ، آدرس شئ ایجاد شده در حافظه ی Heap ذخیره می شود. به مورد اول Value Type و به مورد دوم Reference Type گفته می شود.
در صورتی که مفاهیم بالا برای شما گنگ است می توانید دوره مقدماتی اموزش سی شارپ رو به صورت رایگان دریافت کنید.
زمانی که یک متغیر از نوع Value Type تعریف می کنیم و قصد داریم مقدار ان را بخوانیم ، مستقیم از حافظه Stack به آن دسترسی داریم ولی برای دسترسی به متغیرهای Reference Type ، ابتدا وارد حافظه Stack شده و آدرس خانه ای از Heap که این شئ در آن ذخیره شده را می خوانیم .
وقتی متغیری از نوع Reference Type (متغیر هایی که در Heap ذخیره می شوند ) را معادل متغیر دیگری قرار می دهیم ، یک خانه در حافظه Stack به آن اختصاص داده می شود و آدرس شئ یا متغیر قبلی در Heap در آن قرار می گیرد. در این صورت در هر کدام از این دو متغیر اگر پارامتری را تغییر دهیم ، نتیجه آن در هر دو شو یا متغیر اعمال می شود.
در نمونه کد زیر یک متغیر از جنس integer تعریف کرده ایم که به صورت مستقیم در Stack تعریف و مقدار دهی شده است و یک شئ از کلاس Person تعریف کرده ایم و همانطور که در مثال زیر می بینید در حافظه استک یک خانه به ان اختصاص داده شده است که آدرس محل ذخیره ان شی در Heap را نشان می دهد و شئ تعریف شده در Heap و مقادیر آن هم در همان Heap قرار دارد.
و در ادامه ما یک شئ جدید از کلاس Person ساختیم به نام p2 و آن را برابر با p1 قرار دادیم همانطور که می بینید در Stack یک خانه جدید به آن اختصاص داده شده است که به همان آدرسی اشاره میکند که p1 اشاره می کند.