با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش #c ، را دنبال می کنند. در مورد انواع داده در بخش قبلی صحبت کردیم و با آنها آشنا شدیم . در این جلسه به آموزش متغیرهای مقدار محور (Value type) و مرجع محور (Reference type) می پردازیم .
در #C، نوع داده ها براساس نحوه ذخیره آنها در حافظه طبقه بندی می شوند.
متغیر ها در #C شامل انواع زیر است:
یک نوع داده ، مقدار محور است اگر مقدار داده در فضای حافظه خود داشته باشد. این به بدان معنا است که متغیرهای این نوع داده ها مستقیما دارای مقدارهایشان هستند.
برای مثال متغیر عدد صحیح int i = 100 را در نظر بگیرید.
سیستم عدد ۱۰۰ را در فضای حافظه اختصاص داده شده برای متغیر ‘i’ ذخیره می کند. تصویر زیر نشان می دهد که چگونه عدد ۱۰۰ در حافظه فرضی (۰x239110) برای ‘i’ ذخیره می شود:
نوع داده های زیر مقدار محور هستند :
هنگامی که متغیر مقدار محور را از یک متد به متد دیگر منتقل می کنید، سیستم یک نسخه جداگانه از یک متغیر را در متد دیگری ایجاد می کند، به طوری که اگر مقدار در یک متد تغییر کند، این در متغیر متد دیگری تاثیر نمی گذارد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | static void ChangeValue(int x) { x = 200; Console.WriteLine(x); } static void Main(string[] args) { int i = 100; Console.WriteLine(i); ChangeValue(i); Console.WriteLine(i); } |
با اجراء کدهای بالا ابتدا عدد ۱۰۰ سپس عدد ۲۰۰ و بعد از آن دوباره عدد ۱۰۰ در خروجی نمایش داده می شوند.
در مثال فوق، متغیر i در Main ،حتی پس از انتقال آن به متد ChangeValue و تغییر آن در آنجا نیز تغییری پیدا نمی کند.
بر خلاف انواع مقدار محور ، نوع مرجع محور مقدار را به طور مستقیم ذخیره نمی کند. در عوض، آدرس متغیری که دارای مقدار مورد نظر است در آن ذخیره می شود. به عبارت دیگر، نوع مرجع محور شامل یک اشاره گر به مکان حافظه دیگری است که داده ها را نگه می دارد.
برای مثال، متغیر رشته ای فوق را در نظر بگیرید:
1 | string s = "Hello World!"; |
تصویر زیر نشان می دهد که چگونه سیستم حافظه را برای متغیر رشته ای فوق اختصاص می دهد.
همانطور که می توانید در تصویر بالا مشاهده کنید، سیستم یک مکان تصادفی در حافظه (۰x803200) را برای متغیر s انتخاب می کند. مقدار این متغیر ۰x600000 است که آدرس حافظه ای که دارای مقدار واقعی داده است را نشان می دهد. بنابراين، نوع مرجع محور آدرس محل نگهداری مقدار را ذخیره می کند
انواع داده های زیر از نوع مرجع محور هستند:
وقتی یک متغیر نوع مرجع محور را از یک متد به دیگری انتقال می دهید، یک کپی جدید ایجاد نمی کند؛ در عوض، آدرس متغیر را می گذارد. اگر ما اکنون مقدار متغیر را در یک متد تغییر دهیم، در متدی که فراخوانی میشود نیز منعکس خواهد شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | static void ChangeReferenceType(Student std2) { std2.StudentName = "Steve"; } static void Main(string[] args) { Student std1 = new Student(); std1.StudentName = "Bill"; ChangeReferenceType(std1); Console.WriteLine(std1.StudentName); } |
خروجی کدهای زیر “Steve” خواهد بود.
در مثال بالا، از آنجا که Student یک شی است، وقتی شی ساخته std1 را به متد ChangeReferenceType ارسال میکنیم، در واقع آدرس واقعی حافظه را ارسال می کنیم . بنابراین، هنگامی که متد ChangeReferenceType ستون نام شی std2 را تغییر می دهد، در واقع ستون نام شی std1 را تغییر داده است ، زیرا std1 و std2 هر دو به یک آدرس در حافظه اشاره می کنند.
به طور پیش فرض، زمانی که متغیر های مرجع محور دارای مقدار اولیه نیستند مقدار NULL (خالی) را در خود نگهداری می کنند، این بدان معنا است که آنها به هیچ مکان حافظه دیگری اشاره نمی کنند، زیرا هنوز مقداری ندارند.
یک متغیر مقدار محور نمی تواند null باشد، زیرا دارای یک مقدار است نه یک آدرس حافظه. در هر حال، متغیرهای نوع مقدار محور باید قبل از استفاده ،مقدار خاصی را دریافت کنند . و در غیر اینصورت کامپایلر خطا برمی گرداند.
1 2 3 4 5 6 | void someFunction() { int i; Console.WriteLine(i); } |
با این حال، اگر به فیلد مقدار محور در یک کلاس مقدار پیشفرض داده نشود می تواند بدون مقداردهی اولیه استفاده شود. ، به عنوان مثال، int دارای مقدار ۰ می شود ، Bool دارای مقدار False و … خواهد شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using System; public class myClass{ public int i; } public class Program { public static void Main() { myClass mcls = new myClass(); Console.WriteLine(mcls.i); } } |
خروجی کدهای بالا خط نبوده و مقدار ۰ است.
در این بخش و بخش قبلی به تشریح انواع متغیرهای مقدار محور و مرجع محور پرداختیم.
در بخش بعدی نیز به معرفی انواع کلمات کلیدی در زبان برنامه نویسی #C خواهیم پرداخت.