63. using statement

בפעמים הקודמות הכרנו קצת את IDisposable ואת finally.

ראינו שהדרך המומלצת להשתמש בIDisposable היא באמצעות בלוק של try-finally.

למרבה הצער, לא ממש כיף לכתוב קוד כזה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
FileStream myStream =
new FileStream("AReallyGreatFile.txt",
FileMode.Open,
FileAccess.Read);
try
{
StreamReader myStreamWriter =
new StreamReader(myStream);
try
{
string content =
myStreamWriter.ReadToEnd();
}
finally
{
if (myStreamWriter != null)
{
myStreamWriter.Dispose();
}
}
}
finally
{
if (myStream != null)
{
myStream.Dispose();
}
}

עוד בעיה היא שאחרי הblock עדיין אנחנו יכולים לגשת לאובייקט שהוא כבר מחוק, בדוגמה פשוטה:

1
2
3
4
5
6
7
8
9
FileStream myStream =
new FileStream("AReallyGreatFile.txt",
FileMode.Open,
FileAccess.Read);
// Do stuff
myStream.Dispose();
myStream.Flush(); // Exception

את הבעיות האלה אפשר לפתור בצורה אלגנטית באמצעות שימוש בkeyword נחמד שנקרא using

הkeyword בעצם משתמש בtry-finally כמו שראינו בפעם הקודמת שמומלץ לעשות.

הקוד שראינו מעלה נראה כך כעת:

1
2
3
4
5
6
7
8
9
10
11
12
using (FileStream myStream =
new FileStream("AReallyGreatFile.txt",
FileMode.Open,
FileAccess.Read))
{
using (StreamReader myStreamWriter =
new StreamReader(myStream))
{
string content =
myStreamWriter.ReadToEnd();
}
}

ויש לנו הגנה מגישה לאובייקט אחרי Dispose:

1
2
3
4
5
6
7
8
9
using (FileStream myStream =
new FileStream("AReallyGreatFile.txt",
FileMode.Open,
FileAccess.Read))
{
// Do stuff
}
myStream.Flush(); // Doesn't compile

יום גשום מצוין

שתף