למה אנחנו צריכים להבין מה זה Reference Type ומה זה Value Type?
למה בכלל החברים במיקרוסופט עשו חלוקה ל 2 סוגי Type מרכזיים? יש לזה הצדקה?
אז קודם כל נתחיל בכך שנסביר את ההבדל המרכזי:
Value Type מחזיק את הנתון במקום משלו בזכרון. Reference Type מכיל פוינטר למקום בזכרון שמחזיק את הנתון.
אני חושב שאחת הסיבות העיקריות שביצעו חלוקה כזאת היא מכיוון שלטיפוסי ה Reference הוסיפו שירותים נוספים על ידי הקומפיילר / סביבת זמן ריצה / ביצוע על חשבון ביצועים.
אילו שירותים הם מספקים?
בירושת אובייקטים אנו צריכים תמיכה בפולימורפיזם (שנעשה בהגדרת מטודות וירטואליות). המטודות הוירטואליות מסתמכות על "טבלת מטודות" שמכילות מצביע לאובייקט המכיל את המטודה. המצביע זוהי דוגמא לשירות הנוסף.
עוד שירות נוסף זה היכולת להשתמש ב Reference type בסינכרוניזצית Monitor ( או C# lock)
חוץ מלקחת בחשבון את ה"שרותים" שהתווספו, אנחנו צריכים לחשוב גם על בעיות ביצועים. כאשר שולחים Value Type כפרמטר לפונקציה, אנחנו מעתיקים את ערכו. תחשבו על הבעיה שנוצרת אם אנחנו קוראים לפונקציה הרבה פעמים בתוכנית שלנו. כמה העתקות מיותרות בזיכרון נעשה.. צריך גם לקחת בחשבון אם אנחנו מעבירים לפונקציה struct מורכב..
לכן, צריך לקחת בחשבון את השירותים הנ"ל (ועוד בטבלה שבהמשך) שמסופקים כאשר אנו כותבים קוד. לא נרצה לקבל ביצועים יותר נמוכים (עקב הוספת התקורה של השירותים) כאשר נשמש ב TYPE שנרצה ליצור ממנו אלפי מופעים, לא נרצה לבזבז עבור כל מופע 4-16 ביט של תקורה..
טבלה מסכמת על ההבדלים בין Value Type ל Reference 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 |

עזר לי
השבמחקתודה!