
new מבקשת מקום בזיכרון לאובייקט. ה-garbage collector מחליט מתי האובייקט כבר לא בשימוש, ואז הורס אותו ומחזיר את המקום למאגר הזיכרון.~ ואחריו שם המחלקה. אין לו הרשאת גישה, אין לו ערך מוחזר, ואי אפשר לשלוח לו פרמטרים. אפשר לכתוב דיסטרקטור אחד בלבד בכל מחלקה.Dispose, שילמד במודול אחר.הטקסט המלא של הדקות הראשונות בהרצאה «מפרק - Destructor» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הדבר הבא שאנחנו הולכים לראות באובג'קט אוריינטד נקרא דיסטרקטור. אנחנו מקודם ראינו מה זה קונסטרקטור וראינו שאפשר לבצע במחלקה מספר קונסטרקטורים ושקונסטרקטור זה סך הכל פונקציה מיוחדת שמתבצעת אוטומטית כאשר יוצרים אובייקט מהמחלקה.
דיסטרקטור זה פונקציה שמתבצעת כאשר האובייקט שיצרנו נהרס. מה זאת אומרת נהרס? ראינו שבשביל ליצור אובייקט ישנו תחביר שאנחנו צריכים לכתוב.
בואו נכתוב את ה... או שנראה את התחביר הזה. יש לנו כאן אובייקט מהמחלקה, product, first product זה השם של האובייקט, שווה new product.
ושלחנו כל מיני ערכים לקונסטרקטור. זה בעצם יצירת אובייקט. הפקודה שבאמת יוצרת את האובייקט זאת פקודת ה-new, שמבקשת מקום בזיכרון חדש עבור בדיוק האובייקט הזה.
אבל ב-dotnet קיים איזשהו מנגנון שנקרא garbage collector, garbage collector זה מנגנון שנותן לנו את האובייקט הוא אחראי לדעת שאנחנו אכן משתמשים עם האובייקט הזה וכאשר אנחנו לא צריכים יותר להשתמש עם האובייקט יש לו איזושהי שיטה לדעת את זה
אז הוא פשוט הורס את האובייקט ומחזיר את המקום שלו למאגר הזיכרון של המערכת כך שנוכל להשתמש עוד פעם עם הזיכרון הזה אז ה garbage collector הוא זה שיוצר לנו את האובייקט והוא זה שגם הורס אותו כאשר הוא יוצר לנו אובייקט אז כמובן מופעל קונסטרקטור ואנחנו יכולים לשלוח לקונסטרקטור פרמטרים.
כאשר הגארבץ' קולקטור הורס לנו את האובייקט אז הוא נותן לנו אפשרות להפעיל עוד פונקציה שנקראת דיסטרקטור. בואו נסתכל איך אנחנו יכולים לכתוב את הפונקציה הזאת.
דיסטרקטור תמיד מתחיל בסימן הזה גל כזה והסימן הזה נקרא תילדה. שם של הדיסטרקטור זה שם המחלקה product. דיסטרקטור אין לו הרשאת גישה, אין לו ערך מוחזר ואתם לא יכולים להעמיס אותו או לשלוח לו פרמטרים.
הוא חייב להיכתב בצורה כזאת, אי אפשר להעמיס דיסטרקטורים, יכול להיות לכם אך ורק דיסטרקטור אחד. בואו נניח שבדיסטרקטור כל מה שאני עושה אני מדפיס destroying this product.
כעת בואו נריץ את התוכנית ונסתכל שיש לנו כאן יצירה של האובייקטים, יש לנו כאן הדפסה של מידע ולבסוף, שנייה לפני שהתוכנית נסגרת אנחנו רואים ששלושת האובייקטים שיצרנו עבורם הריסה destroying this object שלוש פעמים למה בעצם ההריסה התבצעה בסוף התוכנית למעשה
כל התוכנית שלי מתחילה במיין ומסתיימת במיין ובמיין פתחנו שלושה אובייקטים 1,2,3 וה garbage collector מבחינתו אומר שאני עדיין רוצה להשתמש באובייקטים האלה ולכן הוא לא הולך להרוס לי אותם כאשר מסתיימת התוכנית המיין הסתיים אז ה garbagecollector כמובן הורס את כל האובייקטים הקיימים כאלה שהוא עדיין לא הרס אותם ברגע
שהוא הורס אותם הוא אוטומטית קורא לדיסטרקטור ואנחנו יכולים בדיסטרקטור לעשות פעולות אחרונות לפני שבאמת האובייקט הזה נהרס.
עכשיו שימו לב רק שאם יש לנו כל מיני אובייקטים נוספים שפתחנו אותם במחלקה שלנו, אובייקטים אחרים של .NET, אסור לנו להשתמש איתם בתוך הדיסטרקטור והסיבה היא כי יכול להיות שהמנגנון של הגארבץ' קולקטור כבר הרס אותם.
הדברים היחידים שמותרים לביצוע בתוך דיסטרקטור זה גישה לכל מיני משאבים שאינם שייכים לדוטנט. לדוגמה, אם אנחנו משתמשים עם איזשהו רכיב ישן שנכתב ב-C++ ומשתמש באזור זיכרון ישן שנקרא שייך ל-C++ ולא שייך לדוטנט, מותר לי בדיסטרקטור לבצע שפרור משאבים נניח
ולהיפטר ממנו. אם לדוגמה שמתי תמונה גדולה בזיכרון מותר לי בדיסטרקטור ללכת ולהיפטר ממנה אבל כל מה שקשור לדוטנט אסור לנו לגעת בו בדיסטרקטור מפני שיכול להיות שאנחנו נוגעים במשהו שכבר לא קיים כי אנחנו מתעסקים פה באזור של פונקציה שמתבצעת כשדברים נהרסים בזיכרון
על ידי אותו מנגנון garbage collector ולכן אסור לנו לגעת בכל מה ששייך לgarbagecollector c++ לדוגמה אם אנחנו משתמשים באיזשהו רכיב ישן בתוכנית לא שייכת לגארבג' קולקטור ולכן אם אנחנו רוצים להיפטר ממשאבים כאלה זה דברים שמותר לעשות.