DCSIMG
boxing - unboxing - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

boxing - unboxing

 

בתפוז עלתה השאלה, מהו 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 יכשל, אע"פ שבדרך כלל זה יעבוד - לדוגמא
 

int i = 10;

long l = i;

 
אך בדוגמא שלנו, שמדובר ב - unboxing חייבים להגדיר את ה - type האמיתי של o.
פורסם: May 24 2011, 11:41 AM by Shlomo | with 2 comment(s)
תגים:, ,

תוכן התגובה

Rotem Bloom כתב/ה:

אחלה של פוסט אבל שווה להדגיש גם את נושא בעיית הביצועים במקרים אילו.

# May 24, 2011 12:56 PM

נועם גל כתב/ה:

רק בשביל לציין נקודה חשובה - value type לא בהכרח יושב על ה stack.

הערך של משתנה מסוג value type הוא ערך ה data שלו.

הערך של משתנה מסוג reference type הוא מצביע (או null) לאובייקט מהסוג של המשתנה.

www.yoda.arachsys.com/.../memory.html

# May 24, 2011 5:18 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 4 and 1 and type the answer here:


Enter the numbers above: