שימוש ב-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");
}
אתגר
קלצרו מתודה בשם processFile ש:
- מקבלת שם קובץ כפרמטר מסוג מחרוזת
- משתמשת במשפט
usingעםStreamReaderכדי לקרוא את כל השורות מהקובץ - מחזירה את מספר השורות בקובץ
- אם מתרחש
FileNotFoundException, מדפיסה "File not found" ומחזירה -1
נסו בעצמכם
using System;
using System.IO;
class ProcessFile
{
public static int processFile(string filename)
{
// כתבו את הקוד שלכם כאן
}
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מערכים רב־ממדיים
יסודות מערכים דו־ממדייםהכרזה ואתחול של מערכים דו־ממדייםגישה לאיברי מערך דו־ממדילולאות מקוננות עם מערכים דו־ממדייםמערכים משונניםפעולות מטריצה נפוצותחזרה – מערכים רב־ממדיים7אופרטורים לוגיים מתקדמים
הערכה בקיצור דרךאופרטורים לוגיים מותניםקדימות אופרטוריםסיכום – אופרטורים מתקדמים2קבלת החלטות מתקדמת
תנאים מרוביםלוגיקה בוליאנית מורכבתהשוואה בין If ל-Switchהצהרות Switch מקוננותסיכום — קבלת החלטות מתקדמת5טיפול בחריגות
יסודות try-catchסוגי חריגותבלוקי catch מרוביםעבודה עם קבציםבלוק finallyשימוש ב-using לעומת try-finallyחריגות מותאמות אישיתסיכום – טיפול בשגיאות3שיפורים בלולאות
ביצועי לולאותאיטרציה במבנים מורכביםכל אחד מסוגי הלולאותרפקטורינג של לולאותסיכום – לולאות שעברו אופטימיזציה6טיפול בערכי Null
יסודות הפניה ל-Nullטיפוסי ערכים שניתנים ל-Nullדפוסי בדיקת Nullתכנות הגנתיסיכום – בטיחות מול Nullתרגלו בעצמכם: קומפיילר C# אונליין