Menu
CoddyTech

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ất
  • ReadLine(): đọc từng dòng một, trả về null khi đế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");
}
challenge icon

Thử thách

Dễ

Tạo một phương thức có tên processFile để:

  1. Nhận tên tệp làm tham số kiểu chuỗi
  2. Dùng câu lệnh using cùng với StreamReader để đọc tất cả các dòng trong tệp
  3. Trả về số dòng trong tệp
  4. 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
    }
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C# online