Using hay try-finally
Thuộc phần Logic và luồng chương trình trong hành trình C# của Coddy. Bài học 28 trên 66.
Cả câu lệnh using và khối lệnh try-finally đều giúp quản lý các tài nguyên cần được giải phóng đúng cách. Câu lệnh using cung cấp cách viết gọn gàng, súc tích hơn để đảm bảo các đối tượng IDisposable được dọn dẹp đúng cách.
Lưu ý: using thay thế cách dùng try-finally để giải phóng tài nguyên. Nó không thay thế try-catch. Bạn vẫn có thể đặt khối using bên trong try-catch để xử lý ngoại lệ.
Trước tiên, hãy cùng xem cách dùng try-finally:
StreamReader reader = null;
try
{
reader = new StreamReader("file.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
Câu lệnh using giúp đoạn code này đơn giản hơn:
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
Câu lệnh using tự động gọi Dispose() khi thoát khỏi khối lệnh, ngay cả khi xảy ra ngoại lệ.
StreamReader là gì?StreamReader là một lớp dùng để đọc văn bản từ các tệp. Bạn tạo một đối tượng bằng cách truyền vào tên tệp, rồi lớp này mở tệp để đọc. Lớp này triển khai IDisposable, vì vậy bạn phải đóng nó đúng cách sau khi dùng. using sẽ giúp bạn xử lý việc đó.
Các phương thức StreamReader thường dùng:
ReadToEnd(): đọc toàn bộ tệp thành một chuỗi duy nhấtReadLine(): đọc từng dòng một, trả vềnullkhi đến cuối tệp
Để đếm số dòng trong một tệp, bạn có thể dùng vòng lặp ReadLine():
using (StreamReader reader = new StreamReader("file.txt"))
{
int lineCount = 0;
while (reader.ReadLine() != null)
{
lineCount++;
}
Console.WriteLine(lineCount);
}
Bạn cũng có thể kết hợp using với try-catch để xử lý các ngoại lệ như trường hợp thiếu tệp:
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");
}
Thử thách
DễTạo một phương thức có tên processFile để:
- Nhận tên tệp làm tham số kiểu chuỗi
- Dùng câu lệnh
usingcùng vớiStreamReaderđể đọc tất cả các dòng trong tệp - Trả về số dòng trong tệp
- Nếu xảy ra
FileNotFoundException, in ra "File not found" và trả về -1
Tự làm thử
using System;
using System.IO;
class ProcessFile
{
public static int processFile(string filename)
{
// Viết code của bạn ở đây
}
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Mảng nhiều chiều
Cơ bản về mảng 2 chiềuKhai báo và khởi tạo mảng 2 chiềuTruy cập phần tử mảng 2 chiềuVòng lặp lồng nhau với mảng 2 chiềuMảng răng cưaCác phép toán ma trận thường gặpÔn tập: mảng nhiều chiều4Kỹ thuật điều khiển luồng
Lệnh trả về sớmMệnh đề bảo vệCâu lệnh nhảy (goto)Break và continueLàm phẳng các câu lệnh điều kiện lồng nhau7Toán tử logic nâng cao
Đánh giá ngắn mạchToán tử logic có điều kiệnĐộ ưu tiên của toán tửÔn tập: toán tử nâng cao2Ra quyết định nâng cao
Nhiều điều kiệnLogic Boolean phức tạpSo sánh if và switchCâu lệnh switch lồng nhauÔn tập về ra quyết định nâng cao5Xử lý ngoại lệ
Cơ bản về try-catchCác loại ngoại lệNhiều khối catchLàm việc với tệpKhối finallyUsing hay try-finallyNgoại lệ tùy chỉnhÔn tập: xử lý lỗi8Hệ thống phân tích dữ liệu
Thiết lập thu thập dữ liệuLogic nhập dữ liệu3Cải tiến vòng lặp
Hiệu suất vòng lặpLặp qua dữ liệu phức tạpTừng kiểu vòng lặpTái cấu trúc vòng lặpÔn tập: vòng lặp tối ưu6Xử lý null
Cơ bản về tham chiếu nullKiểu giá trị có thể nullCác mẫu kiểm tra nullLập trình phòng vệÔn tập về an toàn với nullTự luyện tập: Trình biên dịch C# online