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

מטרת השיעור: הסטודנטים ידעו לבחור בין מערך ל-List<T> לפי הצורך, ולהשתמש נכון בשניהם.

בסוף השיעור הסטודנטים צריכים: ליצור ולגשת לאיברים במערך ובעזרת אינדקס, להוסיף/להסיר איברים מ-List<T>, ולהסביר מתי כל אחד מתאים.

דגש קריטי: הדגימו IndexOutOfRangeException בשידור חי — זו השגיאה הכי שכיחה אצל מתחילים בנושא הזה.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה וחיבור5 דקותשאלו: “איך הייתם שומרים 50 שמות בלי 50 משתנים?”
הבעיה + הרעיון: Array15 דקותיצירה, גישה לפי אינדקס, Length
הבעיה: גודל קבוע10 דקותנסו “להוסיף” איבר למערך מלא — קיר בטון
הרעיון: List<T>20 דקותAdd/Remove/Count — הפתרון לגמישות
Index מ-0 + IndexOutOfRangeException15 דקותהדגימו גישה לאינדקס לא קיים בשידור חי
foreach על שניהם10 דקותהראו תחביר זהה — נקודת חיבור חשובה
תרגול מודרך15 דקותתרגיל 1+2

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

  • אל תציגו List<T> לפני שהראיתם בבירור את המגבלה של מערך (גודל קבוע) — אחרת List<T> נשמע כמו “עוד תחביר” ולא כמו פתרון אמיתי.
  • List<T> הוא הפעם הראשונה שסטודנטים נתקלים בתחביר Generic (<T>) — לא צריך להסביר Generics לעומק כאן, מספיק “T זה placeholder לסוג האיבר שבפנים” — הנושא יחזור בהרחבה בשיעור Generics.
  • שווה להזכיר בקצרה ש-List<T> בנוי מעל מערך פנימית (גדל ע"י יצירת מערך חדש גדול יותר מאחורי הקלעים) — לא להיכנס לזה לעומק, רק לתת אינטואיציה שזה לא “קסם”.

מושגים

Array — אוסף בגודל קבוע מרגע היצירה. List<T> — אוסף דינמי, תומך ב-Add/Remove. Index — מיקום איבר באוסף, מתחיל מ-0. IndexOutOfRangeException — שגיאת ריצה על גישה לאינדקס לא קיים.


תרגיל חשיבה

שאלת פתיחה: “אתם בונים אפליקציית רשימת קניות. המשתמש יכול להוסיף ולמחוק פריטים כל הזמן. מערך או List<T>? למה?”

מהלך: תנו רגע לחשוב. התשובה הנכונה (List<T>) אמורה להיות די ברורה מהר — האתגר האמיתי הוא לנסח למה: כי מספר הפריטים לא ידוע מראש ומשתנה כל הזמן. שאלו דוגמה נגדית: “מתי דווקא מערך היה מתאים כאן?” (למשל: “7 תאים קבועים לימות השבוע בתצוגת לוח שנה”).

מה המרצה מראה בסוף: נסו להוסיף איבר שישי למערך בגודל 5 (array[5] = x) — קריסה. מיד אחר כך, אותה פעולה בדיוק על List<T> עם Add — עובד חלק. הניגוד הישיר הזה מבסס את ההבדל טוב יותר מכל הסבר מילולי.