משך: 2 שעות אקדמיות (90 דקות).

מטרת השיעור: הסטודנטים יבינו למה שינוי פרמטר בפונקציה משפיע לפעמים על המשתנה בחוץ ולפעמים לא, וישתמשו נכון ב-out.

בסוף השיעור הסטודנטים צריכים: לחזות נכון אם שינוי בתוך פונקציה ישפיע על המשתנה המקורי, להסביר את ההבדל בין שינוי-תוכן-אובייקט להחלפת-הפניה, ולהשתמש ב-out בפונקציה מסוג Try.

דגש קריטי: זה אחד הנושאים הכי מבלבלים למתחילים ב-C# — הקדישו זמן להדגמה חיה, לא רק תיאור מילולי.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה וחיבור5 דקותשאלו: “אם אני שולח משתנה לפונקציה ומשנה אותו שם — זה משפיע בחוץ?” — אספו ניחושים
הבעיה + הרעיון: Value Type20 דקותהדגימו TryDouble על int — “לא השתנה!” מפתיע חלק מהסטודנטים
הבעיה + הרעיון: Reference Type20 דקותהדגימו AddItem על List — “כן השתנה!” ניגוד ישיר
שינוי-תוכן מול החלפת-הפניה15 דקותהראו list.Add מול list = new List<>() בתוך פונקציה — קריטי להבהיר
out20 דקותTryDivide, קשרו ל-TryParse שכבר מוכר משיעור ה-IO
תרגול מודרך10 דקותתרגיל 1+2

דגשים להעברת השיעור

  • זה נושא שמצריך הדגמה חיה, לא רק שקופית — הריצו את שני הקטעים (Value ו-Reference) בפועל מול הכיתה ותנו לתוצאה “לדבר בעד עצמה”.
  • ההבחנה בין “לשנות אובייקט קיים” ל"להחליף הפניה" היא הנקודה שהכי הרבה סטודנטים מפספסים — הקדישו לה זמן נפרד ודוגמה משלה, אל תדחסו אותה כהערת אגב.
  • אם יש זמן, קשרו במפורש בחזרה לשיעור ה-IO — out int age ב-TryParse הוא בדיוק הדפוס שנלמד עכשיו לעומק.

מושגים

Value Type — טיפוס שמועבר כעותק (int, double, bool, struct). Reference Type — טיפוס שמועבר כהפניה לאותו אובייקט (string, מחלקות, List<T>). out — פרמטר “יציאה”; הפונקציה חייבת לתת לו ערך, נראה בחוץ.


תרגיל חשיבה

שאלת פתיחה: “אם תשלחו List<int> לפונקציה ובתוכה תוסיפו איבר — זה ישפיע על הרשימה המקורית? ואם תשלחו int ותנסו להכפיל אותו?”

מהלך: תנו לסטודנטים לנחש ולנמק לפני ההדגמה — הניגוד בין הציפייה לתוצאה בפועל הוא מה שמבסס את ההבנה. אל תתקנו מיד — תנו להדגמה החיה לענות.

מה המרצה מראה בסוף: הריצו את שני קטעי הקוד (Value ו-Reference) בזה אחר זה, עם Console.WriteLine לפני ואחרי הקריאה בכל אחד. הניגוד הישיר — “5 נשאר 5” מול “2 הפך ל-3” — הוא ההוכחה הכי משכנעת שיש.