כן
()ExecuteReader מאתחלת עבורך את האובייקט. בשביל מה צריך את זה? בכן, אלה אחד העקרונות הבסיסיים של תכנות מונחה עצמים. אם להחזיר אותך קצת ל-++C, בעצם כשאתה מצהיר על אוביקט באופן הזה:
myClass myObj;
מאחורי הקלעים, בעצם הפכת את myObj ל
פוינטר לאובייקט מסוג myClass. הפוינטר הזה במצבו הראשוני, לא מצביע לכלום (null). כדי לאתחל את האובייקט, ולהקצות לו מקום של ממש בזכרון, משתמשים ב-new. הפקודה הזאת:
myClass myObj = new myClass(); אומרת ל-CLR "צור לי מקום חדש בזכרון עבור האובייקט (וזה בעצם new myClass), ואת הפוינט למקום שבו הוא נמצא שים לי ב-myObj). מכאן ניתן להסיק שאובייקטים בדוט נט, אלא אם הוגדר אחת, תמיד עוברים by reference. קח, בתור דוגמא, את הקוד הבא:
Apple app; app = new Apple(); app = new Apple(); בשורה הראשונה, הגדרנו פוינטר לאובייקט מסוג Apple. לפוינטר הזה קראנו app. בנתיים, הפוינטר הזה מכיל null, כלומר הוא לא מצביע לשום דבר. בשורה השניה, אנחנו מאתחלים ומקצים מקום בזכרון לאובייקט חדש מסוג Apple, ואת הכתובת שלו בזכרון אנחנו שמים בתוך app. עכשיו, app
מצביע ל-instance של המחלקה apple. בשורה השלישית, אנחנו עושים שוב את אותו דבר - שוב מקצים מקום בזכרון ואומרים שעכשיו app מצביע לinstance אחר של Apple. הכתובת שהייתה ב-app קודם לכן אפשר לומר שהיא הלכה פייפן. אם כן, הגענו למצב שבו יש שני אובייקטים שתופסים מקום בזכרון, אבל רק לאחד מהם יש לנו פוינטר כלשהו, ולכן אין לנו דרך להגיע או להשתמש יותר באובייקט הישן. כתוצאה מכך, האובייקט הישן יתפנה ל-Garbage Collection. מקווה שהכל מובן