دوره های آموزشی آکادمی پی وی لرن (پروژه محور و ویژه بازار کار)



  • ۲۵
  • مرداد

جلسه ۰۸ : متغیرهای مقدار محور (Value type) و مرجع محور (Reference type)

  • دسته‌بندی‌ها :
جلسه ۰۸ : متغیرهای مقدار محور (Value type) و مرجع محور (Reference type)
    • جزئیات
    • نوع محتواآموزش تصویری

      مقدمه:

      با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش #c ، را دنبال می کنند. در مورد انواع داده در بخش قبلی صحبت کردیم و با آنها آشنا شدیم . در این جلسه به آموزش متغیرهای مقدار محور (Value type) و مرجع محور (Reference type) می پردازیم .

      در #C، نوع داده ها براساس نحوه ذخیره آنها در حافظه طبقه بندی می شوند.

      متغیر ها در #C شامل انواع زیر است:

      1.  مقدار محور Value type
      2. مرجع محور Reference type

       

      مقدار محور Value type :

      یک نوع داده ، مقدار محور است اگر مقدار داده در فضای حافظه خود داشته باشد. این به بدان معنا است که متغیرهای این نوع داده ها مستقیما دارای مقدارهایشان هستند.

      برای مثال متغیر عدد صحیح int i = 100 را در نظر بگیرید.

      سیستم عدد ۱۰۰ را در فضای حافظه اختصاص داده شده برای متغیر ‘i’ ذخیره می کند. تصویر زیر نشان می دهد که چگونه عدد ۱۰۰ در حافظه فرضی (۰x239110) برای ‘i’ ذخیره می شود:

      متغیر مقدار محور

      متغیر مقدار محور

       

      نوع داده های زیر مقدار محور هستند :

      • bool
      • byte
      • char
      • decimal
      • double
      • enum
      • float
      • int
      • long
      • sbyte
      • short
      • struct
      • uint
      • ulong
      • ushort

      هنگامی که متغیر مقدار محور را از یک متد به متد دیگر منتقل می کنید، سیستم یک نسخه جداگانه از یک متغیر را در متد دیگری ایجاد می کند، به طوری که اگر مقدار در یک متد تغییر کند، این در متغیر متد دیگری تاثیر نمی گذارد.

      مثال : 

      با اجراء کدهای بالا ابتدا عدد ۱۰۰ سپس عدد ۲۰۰ و بعد از آن دوباره عدد ۱۰۰ در خروجی نمایش داده می شوند.

      در مثال فوق، متغیر i در Main ،حتی پس از انتقال آن به متد ChangeValue و تغییر آن در آنجا نیز تغییری پیدا نمی کند.

       

      مرجع محور Reference type :

      بر خلاف انواع مقدار محور ، نوع مرجع محور مقدار را به طور مستقیم ذخیره نمی کند. در عوض، آدرس متغیری که دارای مقدار مورد نظر است در آن ذخیره می شود. به عبارت دیگر، نوع مرجع محور شامل یک اشاره گر به مکان حافظه دیگری است که داده ها را نگه می دارد.

      برای مثال، متغیر رشته ای فوق را در نظر بگیرید:

      مثال : 

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

       

      متغیر مرجع محور

      متغیر مرجع محور

       

      همانطور که می توانید در تصویر بالا مشاهده کنید، سیستم یک مکان تصادفی در حافظه (۰x803200) را برای متغیر s انتخاب می کند. مقدار این متغیر ۰x600000 است که آدرس حافظه ای که دارای مقدار واقعی داده است را نشان می دهد. بنابراين، نوع مرجع محور آدرس محل نگهداری مقدار را ذخیره می کند

      انواع داده های زیر از نوع مرجع محور هستند:

      • String
      • All arrays
      • Class
      • Delegates

       

      وقتی یک متغیر نوع مرجع محور را از یک متد به دیگری انتقال می دهید، یک کپی جدید ایجاد نمی کند؛ در عوض، آدرس متغیر را می گذارد. اگر ما اکنون مقدار متغیر را در یک متد تغییر دهیم، در متدی که فراخوانی میشود نیز منعکس خواهد شد.

      مثال : 

      خروجی کدهای زیر “Steve” خواهد بود.

      در مثال بالا، از آنجا که Student یک شی است، وقتی شی ساخته std1 را به متد ChangeReferenceType  ارسال میکنیم، در واقع آدرس واقعی حافظه را ارسال می کنیم . بنابراین، هنگامی که متد ChangeReferenceType ستون نام شی std2 را تغییر می دهد، در واقع ستون نام شی std1 را تغییر داده است ، زیرا std1 و std2 هر دو به یک آدرس در حافظه اشاره می کنند.

       

      مقدار NULL :

      به طور پیش فرض، زمانی که متغیر های مرجع محور دارای مقدار اولیه نیستند مقدار NULL (خالی) را در خود نگهداری می کنند، این بدان معنا است که آنها به هیچ مکان حافظه دیگری اشاره نمی کنند، زیرا هنوز مقداری ندارند.

      متغیر دارای مقدار NULL

      متغیر دارای مقدار NULL

       

      یک متغیر مقدار محور نمی تواند null باشد، زیرا دارای یک مقدار است نه یک آدرس حافظه. در هر حال، متغیرهای نوع مقدار محور باید قبل از استفاده ،مقدار خاصی را دریافت کنند . و در غیر اینصورت کامپایلر خطا برمی گرداند.

      مثال : 

      با این حال، اگر به فیلد مقدار محور در یک کلاس مقدار پیشفرض داده نشود می تواند بدون مقداردهی اولیه استفاده شود. ، به عنوان مثال، int دارای مقدار ۰ می شود ، Bool دارای مقدار False و … خواهد شد.

      مثال : 

      خروجی کدهای بالا خط نبوده و مقدار ۰ است.

       

      نکات مهم :

      1. متغیرهای نوع مقدار محور در حافظه مقدار خود را ذخیره می کنند، در حالی که متغیرهای نوع مرجع محور آدرس محل ذخیره شدن مقدار را نگهداری می کنند.
      2. انواع متغیرهای داده اولیه و ساختاری از نوع مقدار محور هستند و انواع اشیاء در کلاس ها، رشته ها، آرایه ها و … نیز از نوع مرجع محور هستند.
      3. نوع مقدار محور به طور پیش فرض به صورت byval و نوع مرجع محور به طور پیش فرض بصورت byref استفاده می شود.
      4. انواع متفیرهای مقدار محور و مرجع محور در پشته ذخیره می شوند و پشته در حافظه بستگی به دامنه متغیر دارد.

       

      در این بخش و بخش قبلی به تشریح انواع متغیرهای مقدار محور و مرجع محور پرداختیم.

      در بخش بعدی نیز به معرفی انواع کلمات کلیدی در زبان برنامه نویسی #C خواهیم پرداخت.

      QR:  جلسه ۰۸ : متغیرهای مقدار محور (Value type) و مرجع محور (Reference type)
      به اشتراک بگذارید