יום שני, 15 באפריל 2013

למה צריך להבין מה זה Reference Type מול Value Type?

למה אנחנו צריכים להבין מה זה Reference Type ומה זה Value Type?
למה בכלל החברים במיקרוסופט עשו חלוקה ל 2 סוגי Type מרכזיים? יש לזה הצדקה?

אז קודם כל נתחיל בכך שנסביר את ההבדל המרכזי:
Value Type מחזיק את הנתון במקום משלו בזכרון. Reference Type מכיל פוינטר למקום בזכרון שמחזיק את הנתון.



עץ ה Type's

אני חושב שאחת הסיבות העיקריות שביצעו חלוקה כזאת היא מכיוון שלטיפוסי ה Reference הוסיפו שירותים נוספים על ידי הקומפיילר / סביבת זמן ריצה / ביצוע על חשבון ביצועים.
אילו שירותים הם מספקים?
בירושת אובייקטים אנו צריכים תמיכה בפולימורפיזם (שנעשה בהגדרת מטודות וירטואליות). המטודות הוירטואליות מסתמכות על "טבלת מטודות" שמכילות מצביע לאובייקט המכיל את המטודה. המצביע זוהי דוגמא לשירות הנוסף.
עוד שירות נוסף זה היכולת להשתמש ב Reference type בסינכרוניזצית Monitor   ( או C# lock)

חוץ מלקחת בחשבון את ה"שרותים" שהתווספו, אנחנו צריכים לחשוב גם על בעיות ביצועים. כאשר שולחים Value Type כפרמטר לפונקציה, אנחנו מעתיקים את ערכו. תחשבו על הבעיה שנוצרת אם אנחנו קוראים לפונקציה הרבה פעמים בתוכנית שלנו. כמה העתקות מיותרות בזיכרון נעשה.. צריך גם לקחת בחשבון אם אנחנו מעבירים לפונקציה struct מורכב..

לכן, צריך לקחת בחשבון את השירותים הנ"ל (ועוד בטבלה שבהמשך) שמסופקים כאשר אנו כותבים קוד. לא נרצה לקבל ביצועים יותר נמוכים (עקב הוספת התקורה של השירותים) כאשר נשמש ב TYPE שנרצה ליצור ממנו אלפי מופעים, לא נרצה לבזבז עבור כל מופע 4-16 ביט של תקורה..

טבלה מסכמת על ההבדלים בין Value Type ל Reference Type:


Value Types Reference Types
מחזיקים ישירות את הנתונים מחזיקים רפרנס לנתונים
שמורים על ה stack (אלא אם מוגדרים כמשתנים בתוך  Object Class) שמורים על ה heap
לא יכולים להיות null  אלא אם מגדירים אותם כ nullable יכולים להיות null
יש להם ערך דיפולטיבי אין להם ערך דיפולטיבי
אין צורך ב garbage collector, הכל מתבצע במהירות ב runtime ה garbage collector מנקה את הזיכרון 
בהעתקת תוכן של משתנה אחד לשני, שינוי של משתנה אחד לא משפיע על השני בהעתקת תוכן של משתנה אחד לשני, שינוי של משתנה אחד משנה את השני בהתאם
יורשים מ System.ValueType שיורש מ System.Object יורשים מ System.Object
כשמעבירים כפרמטר לפונקציה אז הערך מועתק כשמעבירים פרמטר לפונקציה אז מעבירים את הרפרנס
פונקציית Equal משווה את הערכים פונקציית Equal משווה את הרפרנסים
ממומש כ Struct ממומש כ Class
תהנו!

תגובה 1: