DCSIMG
מאחורי הקלעים של Nullable - או ?int - שלמה גולדברג (הרב דוטנט)

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

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

מאחורי הקלעים של Nullable - או ?int

 

עמית לעבודה שאל אותי האם כשמגדירים nullable זה יושב ב - stack או ב - heap,
 
בהתחלה עניתי בלי לחשוב שזה יושב ב - heap, אבל אז חשבנו שזה לא הגיוני כי אם זה יושב ב - heap אז מה כל החכמה בזה ?
 
ואז הסתכלנו וראינו ש - nullable הוא למעשה struct ולא class, מה שאומר שהגדרה של ?int תשב ב - stack.
 
ואז שאלנו את עצמנו איך יכול להיות שאפשר לתת את הערך null או לבדוק האם מופע של nullable הוא null.
 
חקרנו קצת בעזרת ה - reflector ועלינו על הממצאים הבאים:
 
אין ולא יכול להיות הערך null במופע של nullable, מה שקורה באמת זה מספר טריקים של הקומפיילר.
 
1. השמה לתוך nullable

int? j = null;

 
 
למעשה מתרגמת לקריאה של בנאי ברירת המחדל של struct ובמילים אחרות ב - IL אין זכר להשמה של הערך null לתוך j. יש קריאה פשואה לבנאי של nullable שנותן את הערך false למשתנה hasValue.
 
2. בדיקה האם nullable שווה ל - null - מתרגמת לקריאה של המאפיין HasValue, כלומר הקומפיילר יודע להמיר את הבדיקה:

if(j == null)

 
ל -

if(j.HasValue)

 
וזה כל הטריק
פורסם: Sep 22 2009, 03:44 PM by Shlomo | with no comments
תגים:, ,
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 2 and 8 and type the answer here:


Enter the numbers above: