مسعود آقاجانی
مسعود آقاجانی
خواندن ۲ دقیقه·۲ سال پیش

Refrece Type vs Value Type


سلام


موردی که میخوام توضیح بدم Refrece Type vs Value Type هستش

قبل هرچیزی بهتره یه خورده با ساختار ذخیره سازی در حافظه اشاره کنم.

حافظه کامپیوتر از نظر مفهومی به تعدادی قطعه‌ی جداگانه تقسیم شده است. دوتا از این قطعات، Stack و Heap نامیده می‌شوند.

Stack

حجم کمتر و ثابت و memory manegment هم کنترلش میکند ساختار ذخیره ان هم به صورت FILO هستش(First In Last Out). از آنجا که در حافظه stack نیازی به پیدا کردن فضای خالی در حافظه نیست و محل قرارگیری اطلاعات مشخص است (بالای حافظه) بنابراین این حافظه سریع تر از حافظه heap است.

Heap

کند تر هستش و با حجم بیشتر و متغیر ،memory manegmentهم کنترلش نمیکند و وظیفه اون بر عهده برنامه نویس هستش.حالا یا دستی یا با (Garbage Collector)GC. به دلیل محاسبات برای یافتن آدرس شروع حافظه و در اختیار گرفتن pointer حافظه heap نسبت به stack کندتر است. همچنین اگر داده ها به صورت پشت سر هم درblock های حافظه قرار نگرفته باشند (این احتمال بسیار زیاد است) موجب کندی در بازیابی اصلاعات خواهد شد

حالا میریم سراغ بحث اصلی خودمون:

ValueType:

شامل متغیر های int,double,boolan,floatو... میشود در واقع متغیر هایی که در ساختار struct تعریف میشود و در قسمت Stackاز حافظه ذخیره میشود .تا زمانی که مقداری به انها داده نشده باشد حافظه ای اختصاص داده نمیشود

مثلا:

Int x=10 ;


Int y=x;

RefrenceType:

شامل متغیر هایclass,enum,sting,interface... میشود و در قسمت Stackاز حافظه تعریف میشود ولی مقادیرش در قسمت heap قرار میگیرد و اگر مقداری نداشته باشد توسط GCپاک میشود مثلا:

Student s1


Student s1=new student();

Student s2=s1;


در VT چون مقایر در یک بلوک جدا از حافظه است تغییر در مقدار آن بعد از تعریف و مقدار دهی اثری در مقدار اولیه ندارد.

Int x=5;

Static void change(int x)

{

X=200;

}

Change(x);

Console.writeline(x); result =5 !!!


البته روش هایی برای تغییر مقدار اولیه وجود دارد(پارامتر های ref/out)

این نکته در مورد RFوجود ندارد و با تغییر مقدار بعد از تعریف و مقدار دهی مقادیر اولیه هم عوض میشود. چون هر دو به یک بلوک از حافظه اشاره میکند و با تغییر مقدار بلوک هر متغییری که به آن بلوک اشاره کند مقدار تغییر یافته را دریافت میکند.


Student s1=new student();

S1.name=masoud

S1.id=5;

Static void change(student s)

{

s.id=10;

s.name=jack;

}

Change(s1);

Console.writeline(s.name); result =10!!!

Console.writeline(s.id); reuslt =jack!!!



در یک گراف بخوام نحوه ذخیره سازی VTو RTرو بکشم شبیه شکل زیر میشود:


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