בתפוז עלתה השאלה, מהו boxing - להלן הסבר בסיסי.
בעולם ה - NET המשתנים מחולקים לשני סוגים, אלה שנקראים value type ואלה שנקראים reference type, (נקרא להם val, ref בהתאמה) ההבדל המרכזי ביניהם הוא היכן הם ממוקמים בזיכרון כשמגדירים אותם,
ה - val ממוקם במקום שנקרא stack, שנניח נראה ככה (לא בדיוק)
name type value
i int 10
c12 char f
לעומת זאת האובייקטים מסוג ref ממוקמים במקום אחר הנקרא heap כשהגישה אליו היא דרך מצביע מה - stack
i int 10
c12 char f
p1 Perons 23F2A (address of p1 data)
עכשיו נעבור לרגע לנקודה נוספת,
בעולם ה - Object Oriented אנחנו יודעים שאבא יכול להצביע לבן - לדוגמא - נניח שיש מחלקה בשם Person ויש מחלקה יורשת בשם Employee הקוד הבא יהיה חוקי
Person e1 = new Employee();
מכיוןן שבכל Employee יש Person קטן.
לפי הטענה הקודמת גם הקוד הבא יהיה חוקי
int i = 10;
object o = i;
זה אכן נכון, מכיוון ש - object הוא האבא של כל האובייקטים ב - NET.
אבל השאלה היא הרי object הוא מסוג ref (מכיוון שהוא class) לעומת int שהוא val (מכיוון שהוא struct), ברור לחלוטין שהערך של i יושב ב -stack אבל היכן יושב o ?
התשובה היא Boxing!
כשמגדירים מצביע מסוג ref אבל הערך האמיתי הוא val קורה הדבר הבא ב - stack
i int 10
o object DD124 (address of o)
אבל ב - heap אין את סתם את הערך 10 אלא זה נראה כך:
-----------
10
Int32
----------
כלומר עטפו (box) את הערך 10 באובייקט וסימנו אותו שה - type האמיתי הוא int
וזהו boxing.
הבעייה עם התהליך היא בעיקר ב - unboxing - כלומר כשרוצים להוציא את הערך ולהשתמש בו, למשל
int i = 10;
object o = i;
int j = (int)o;
j++;
הפעולה שעשינו היא לא casting רגיל אלא unboxing - והתהליך כולל גם בדיקה האם האובייקט o מוגדר אכן כ - int. ניסיון להמיר אותו ל - long יכשל, אע"פ שבדרך כלל זה יעבוד - לדוגמא
אך בדוגמא שלנו, שמדובר ב - unboxing חייבים להגדיר את ה - type האמיתי של o.