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