# מערך שיעור: Value מול Reference, ו-out📋 מערך מרצה

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

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

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

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

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | שאלו: "אם אני שולח משתנה לפונקציה ומשנה אותו שם — זה משפיע בחוץ?" — אספו ניחושים |
| הבעיה + הרעיון: Value Type | 20 דקות | הדגימו TryDouble על int — "לא השתנה!" מפתיע חלק מהסטודנטים |
| הבעיה + הרעיון: Reference Type | 20 דקות | הדגימו AddItem על List — "כן השתנה!" ניגוד ישיר |
| שינוי-תוכן מול החלפת-הפניה | 15 דקות | הראו `list.Add` מול `list = new List<>()` בתוך פונקציה — קריטי להבהיר |
| out | 20 דקות | 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" — הוא ההוכחה הכי משכנעת שיש.
