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

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

בסוף השיעור הסטודנטים צריכים: להשתמש ב-File/StreamWriter/StreamReader לכתיבה וקריאה, להסביר למה using נחוץ, ולעטוף פעולות קובץ ב-try/catch מתאים.

דגש קריטי: הדגישו שנתוני זיכרון “נעלמים” בסגירת התוכנית — זו הבעיה הבסיסית שכל השיעור פותר, ולא מובנת מאליה לסטודנטים שרק כתבו קוד קונסולה עד כה.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה וחיבור5 דקותהריצו תוכנית עם רשימה בזיכרון, סגרו וידגימו שהנתונים נעלמו
הרעיון: File.WriteAllText/ReadAllText15 דקותהדרך הפשוטה ביותר
StreamWriter/StreamReader20 דקותשורה-שורה, יעילות לקבצים גדולים
הבעיה: משאב לא סגור10 דקותהראו (או תארו) קובץ “תקוע” בלי using
הרעיון: using15 דקותסגירה אוטומטית, גם עם חריגה
try/catch סביב IO10 דקותFile.Exists + IOException יחד
תרגול מודרך15 דקותתרגיל 1+2

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

  • ההדגמה הפותחת (נתונים “נעלמים” בסגירת תוכנית) חייבת להיות מוחשית — הריצו תוכנית עם List בזיכרון, מלאו אותה, סגרו וההריצו מחדש כדי להראות שהיא ריקה שוב.
  • קשרו using בחזרה ל-finally שכבר מוכר מהיחידה הקודמת — “זה בדיוק אותו רעיון, בתחביר מובנה יעודי למשאבים”.
  • הפרויקט המסכם של היחידה (Naive Bayes) ישתמש בקריאת CSV גדול — כדאי לרמוז על כך כאן, כדי לחבר את הנושא לפרויקט שמתקרב.

מושגים

File.ReadAllText/WriteAllText — קריאה/כתיבה שלמה בפעולה אחת. StreamReader/StreamWriter — קריאה/כתיבה שורה-שורה, יעילים לקבצים גדולים. using — מבטיח סגירת משאב אוטומטית, גם בחריגה.


תרגיל חשיבה

שאלת פתיחה: “אם שוכחים לסגור StreamWriter שפתחתם לקובץ, ומריצים את התוכנית שוב מיד אחר כך — מה יכול להשתבש?”

מהלך: תנו לסטודנטים לשער — קובץ “נעול” על ידי התהליך הקודם, שגיאת גישה בהרצה השנייה, או נתונים שלא נשמרו בפועל (כי ה-buffer לא נוקה). הובילו לתובנה ש"סגירה" היא לא רק ניקיון קוד — היא בעלת השלכות אמיתיות על משאבי מערכת ההפעלה.

מה המרצה מראה בסוף: אם אפשר בבטחה, הדגימו קובץ שנשאר “תפוס” (למשל ניסיון למחוק אותו בסייר הקבצים בזמן שהתוכנית עדיין רצה בלי using/Dispose) — לעומת אותו תרחיש עם using, שבו הקובץ משתחרר מיד אחרי שהבלוק מסתיים.