#csharp_for_beginners
باکسینگ (Boxing)
باکسینگ Boxing زمانی اتفاق میافتد که یک مقدار از نوعهای مقداری مثل int یا double به یک نوع مرجع مانند object تبدیل شود. در این فرایند یک شیء جدید در حافظهٔ heap ایجاد میشود و مقدار داخل آن قرار میگیرد. بعد از انجام باکسینگ Boxing، مقدار اولیه و مقدار قرار دادهشده داخل شیء دو دادهی جداگانه خواهند بود و این عملیات به دلیل ایجاد شیء جدید از نظر عملکردی هزینهبر است.
نمونه کد:
int i = 123;
object o = i; // جعبهسازی
i = 456;
Console.WriteLine(i);
Console.WriteLine(o);
آنباکسینگ (Unboxing)
اما Unboxing تبدیل برعکس Boxing است و زمانی رخ میدهد که بخواهیم مقدار موجود در یک شیء از نوع object را دوباره به نوع مقداری اصلی خود تبدیل کنیم. این کار باید به صورت صریح انجام شود، یعنی لازم است نوع مقصد را حتماً با cast مشخص کنیم. در زمان اجرای برنامه بررسی میشود که آیا شیء واقعاً حاصل یک عملیات Boxing از همان نوع مقداری مورد انتظار هست یا خیر. اگر بررسی موفق باشد، مقدار ذخیره شده در heap به یک متغیر مقداری کپی میشود. اما اگر شیء تهی (null) باشد یا نوع واقعی آن با نوعی که انتظار داریم مطابقت نداشته باشد، برنامه خطاهایی مانند NullReferenceException یا InvalidCastException تولید میکند.
نمونه کد:
int i = 123;
object o = i; // جعبهسازی
try
{
int j = (int)o; // ازجعبهسازی درست
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
نمونهٔ خطا:
int i = 123;
object o = i;
try
{
short x = (short)o; // خطای InvalidCastException
}
catch (InvalidCastException e)
{
Console.WriteLine("Incorrect unboxing");
}
باکسینگ Boxing و آنباکسینگ Unboxing به دلیل تخصیص حافظه و بررسی نوع در زمان اجرا از نظر عملکردی هزینهبر هستند. در بخشهایی از برنامه که این عملیات زیاد انجام میشود ممکن است باعث کاهش کارایی شوند. برای جلوگیری از این مشکل، استفاده از Genericها میتواند بسیار مؤثر باشد زیرا تبدیلهای غیرضروری را حذف میکند.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______