عمل Boxing و UnBoxing
نام دوره: زبان سی شارپ مقدماتی
نویسنده: علی مقدم جاه (مدرس دوره)
عمل Boxing و UnBoxing
در پست آموزش انواع Data Type ها در زبان سیشارپ، با دستههای value type و reference type آشنا شدید.
همانطور که میدانید، دسته value type ها در بخش stack حافظه قرار گرفتهاند که این امر باعث افزایش سرعت پردازش آنها شده است، و متقابلا دسته reference type ها در بخش heap حافظه قرار دارند که چون داده را بصورت مستقیم در خود ذخیره نمیکنند، نسبت به دسته value type ها از سرعت پایینتری برخوردارند.
در اکثر اوغات شما در برنامه خود نیاز دارید که یک داده از دسته Value type را به یک نوع دادهای از دسته Reference type ها تبدیل کنید! و همچنین گاها نیاز میشود تا یک داده را از دسته reference type ها به یک نوع داده از دسته value type ها تبدیل کنید.
الف) عمل Boxing
یعنی تبدیل یا انتقال یک نوع داده مقداری از دسته Value type ها، به یک نوع داده ارجاعی از دسته reference type ها:
int age = 26;
object test = age;
test = 26
همانطور که در قطعه کد بالا مشاهده میکنید، متغیر age از نوع int یعنی از دسته Value type ها است و متغیر test از نوع object یا همان کلاس از دسته reference type ها است؛ ما age را درون test مقداردهی کردیم که به این عمل، عمل Boxing میگویند.
ب) عمل UnBoxing
یعنی تبدیل یا انتقال یک نوع داده ارجاعی از دسته reference type ها، به یک نوع داده مقداری از دسته value type ها:
object test = 26;
int age = test;
Error
همانطور که در قطعه کد بالا مشاهده میکنید، متغیر age از نوع int یعنی از دسته Value type ها است و متغیر test از نوع object یا همان کلاس از دسته reference type ها است؛ ما test را درون age مقداردهی کردیم که به این عمل، عمل UnBoxing میگویند، اما اگر این قطعه کد را درون IDE خود اجرا کنید، قطعا به شما Error خواهد داد!
برای انجام عمل UnBoxing نیاز به تبدیل نوع داده یا همان Type Casting دارید.
در پستهای آموزشی در رابطه با تبدیل دادهها به یکدیگر، ۳ روش متفاوت مثل متد Parse، متد TryParse و متدهای درون کلاس Convert را برایتان توضیح دادهایم.
اما حال میخواهیم در این بخش که درحال یادگیری عملیات Boxing و UnBoxing هستید، روش چهارم تبدیل دادهها را آموزش دهیم.
نکته مهم: در این روش، درصورت لزوم سیستم میتواند حذف داده انجام دهد!
پس به شدت مراقب باشید تا دادههایتان پاک نشود.
به عنوان مثال فرض کنید یک ظرف از نوع float با مقدار ۱۹.۲۵ دارید که میخواهید آن را درون یک ظرف از نوع int مقداردهی کنید، در این حالت قطعا باید ابتدا float را به int تبدیل نمایید و استفاده از این روش چهارم باعث میشود که سیستم در هنگام تبدیل float به int، مقدار ۱۹.۲۵ را به مقدار ۱۹ تبدیل کند، یعنی ۰.۲۵ را حذف میکند! پس خیلی باید در هنگام استفاده از این روش تبدیل دادهها به یکدیگر مراقب باشید.
خب برگردیم به موضوع UnBoxing؛ همانطور که در قطعه کد بالا مشاهده نمودید، نمیتوانیم test را درون age مقداردهی کنیم، به طور کلی مقداردهی یک Value type با مقدار reference type ها غیر ممکن است؛ در این حالت باید ابتدا test را که از دسته Reference type ها است، به نوع داده مورد نیاز خودمان از دسته value type تبدیل کرده و سپس آن را درون age مقداردهی کنیم:
object test = 26;
int age = (int)test;
در قطعه کد بالا، ما ابتدا توسط عبارت (int) که دقیقا در پشت شناسه test نوشتهایم، به سیستم فهماندیم که باید اول test را که از جنس object است به نوع دادهای int تبدیل کرده و سپس آن را درون ظرف age از نوع int مقداردهی کند.
پس روش چهارم تبدیل دادهها به یکدیگر، استفاده از عبارت (نوع داده مقصد) بوده که باید حتما در سمت چپ شناسه دادهای که باید تبدیل شود، قرار گیرد.
مثلا در قطعه کد بالا، عبارت (int) که از سمت چپ به شناسه test چسبیده است، به این معنی بوده که باید مقدار ذخیره شده درون متغیری با شناسه test را ابتدا تحت هر شرایطی که شده به نوع دادهای int تبدیل کند.
جهت شرکت در دورههای زبان برنامه نویسی سیشارپ، از کد تخفیف heplc30 استفاده کنید.