Menu
Coddy logo textTech

שימוש ב-using לעומת try-finally

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C# של Coddy. שיעור 28 מתוך 66.

גם הצהרות using וגם בלוקי try-finally מסייעים בניהול משאבים שיש לשחרר כראוי. הצהרת using מספקת דרך נקייה ותמציתית יותר להבטיח שאובייקטים מסוג IDisposable ינוקו כראוי.

הערה: using מחליף את תבנית try-finally לצורך שחרור משאבים. הוא לא מחליף את try-catch. עדיין אפשר לעטוף בלוק using בתוך try-catch כדי לטפל בחריגות.

נתחיל בבחינת גישת try-finally:

StreamReader reader = null;
try
{
    reader = new StreamReader("file.txt");
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}
finally
{
    if (reader != null)
    {
        reader.Dispose();
    }
}

ההצהרה using מפשטת את הקוד הזה:

using (StreamReader reader = new StreamReader("file.txt"))
{
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}

ההצהרה using קוראת אוטומטית ל־Dispose() כאשר יוצאים מהבלוק, גם אם מתרחשת חריגה.

מהו StreamReader?
StreamReader היא מחלקה המשמשת לקריאת טקסט מקבצים. יוצרים מופע שלה על ידי העברת שם קובץ, והיא פותחת את הקובץ לקריאה. היא מממשת את IDisposable, ולכן יש לסגור אותה כראוי לאחר השימוש, וזה בדיוק מה ש-using עושה בשבילך.

מתודות נפוצות של StreamReader:

  • ReadToEnd(): קוראת את כל הקובץ כמחרוזת אחת
  • ReadLine(): קוראת שורה אחת בכל פעם, ומחזירה null כשמגיעים לסוף הקובץ

כדי לספור שורות בקובץ, אפשר להשתמש בלולאת ReadLine():

using (StreamReader reader = new StreamReader("file.txt"))
{
    int lineCount = 0;
    while (reader.ReadLine() != null)
    {
        lineCount++;
    }
    Console.WriteLine(lineCount);
}

אפשר גם לשלב בין using לבין try-catch כדי לטפל בחריגות, כמו למשל קובץ חסר:

try
{
    using (StreamReader reader = new StreamReader("file.txt"))
    {
        int lineCount = 0;
        while (reader.ReadLine() != null)
        {
            lineCount++;
        }
        Console.WriteLine(lineCount);
    }
}
catch (FileNotFoundException)
{
    Console.WriteLine("File not found");
}
challenge icon

אתגר

קל

צרו מתודה בשם processFile ש:

  1. מקבלת שם קובץ כפרמטר מסוג מחרוזת
  2. משתמשת במשפט using עם StreamReader כדי לקרוא את כל השורות מהקובץ
  3. מחזירה את מספר השורות בקובץ
  4. אם מתרחש FileNotFoundException, מדפיסה "File not found" ומחזירה ‎-1

נסו בעצמכם

using System;
using System.IO;

class ProcessFile
{
    public static int processFile(string filename)
    {
        // כתבו את הקוד שלכם כאן
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר C# אונליין