בפעמים הקודמות הכרנו קצת את 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); myStream.Dispose(); myStream.Flush();
|
את הבעיות האלה אפשר לפתור בצורה אלגנטית באמצעות שימוש ב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)) { } myStream.Flush();
|
יום גשום מצוין