Câu lệnh using trong C# có hai mục đích chính:
- using statement: Quản lý vòng đời đối tượng implement
IDisposable, đảm bảoDispose()được gọi tự động (dù có exception). - using directive: Nhập namespace (
using System;).
Bài này tập trung vào using statement để quản lý tài nguyên.
Cơ chế hoạt động
using (ResourceType resource = new ResourceType()) { // Sử dụng resource } // Tương đương: ResourceType resource = new ResourceType(); try { // Sử dụng resource } finally { if (resource != null) resource.Dispose(); }
Ví dụ: Tự giải phóng tài nguyên
using System;
class SystemResource : IDisposable
{
public void Dispose()
{
Console.WriteLine("C - Giải phóng tài nguyên (Dispose)");
}
}
class Demo
{
static void Main()
{
Console.WriteLine("Bắt đầu");
using (SystemResource res = new SystemResource())
{
Console.WriteLine("A - Trong block using");
} // Dispose() tự động gọi ở đây
Console.WriteLine("B - Sau block using");
Console.ReadKey();
}
}
Kết quả
Bắt đầu A - Trong block using C - Giải phóng tài nguyên (Dispose) B - Sau block using
Các trường hợp dùng using
- File I/O:
using (var fs = new FileStream(...)),using (var sr = new StreamReader(...)) - Database:
using (var conn = new SqlConnection(...)),using (var cmd = new SqlCommand(...)) - Graphics:
using (var g = Graphics.FromImage(...)) - Network:
using (var client = new HttpClient())(lưu ý: HttpClient nên dùng singleton)
Using declaration (C# 8.0+)
Không cần block { }, tài nguyên giải phóng ở cuối scope:
using var fs = new FileStream("test.txt", FileMode.Open);
// code...
// fs.Dispose() tự động gọi khi ra khỏi method/scope
Lưu ý: Chỉ dùng cho đối tượng implement IDisposable hoặc IAsyncDisposable.