Bạn phải hiểu using để làm cái gì đã:
C# (hoặc DotNet) có một cơ chế gọi là Disposable, dựa trên mô thức Dispose (Dispose Pattern).
Class của bạn nếu muốn theo cơ chế này thì phải implement interface IDisposable, bao gồm implement 2 hàm: void Dispose(bool disposing)
và Dispose()
, chi tiết bạn xem ở đây: https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose
Muốn dùng using, object của bạn phải là từ Class nào đó có implement cái interface IDisposable, nếu không mà dùng thì văng Exception.
Nếu viết vầy (https://msdn.microsoft.com/en-us/library/system.io.binaryreader):
using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
{
writer.Write(1.250F);
writer.Write(@"c:\Temp");
writer.Write(10);
writer.Write(true);
}
Thì khi flow của chương trình đi ra khỏi scope của using, hệ thống DotNet sẽ tự động gọi writer.Dispose()
. Dispose ở đây là để dọn dẹp những dữ liệu mà cần phải được dọn dẹp một cách đặc biệt ở trong object đó, chứ bản thân object đó vẫn tồn tại sau đó (Garbage Collector sẽ làm phần còn lại).
Keyword using mỗi lần chỉ dùng cho 1 variable, nếu muốn dùng cho 100 variable thì viết liên tiếp 100 lần (https://stackoverflow.com/questions/9396064/using-statement-with-multiple-variables):
using (var sr = new StringReader(content))
using (var xtr = new XmlTextReader(sr))
{
obj = XmlSerializer.Deserialize(xtr) as TModel;
}
Bạn không cần phải viết new ở trong using, bỏ 1 giá trị vào là được.
Còn dùng riêng cho các function/method thì của ai nấy xài, chẳng có cách nào khác. Nhưng nếu các object của bạn đều có thể được dùng chung và tái sử dụng, thì bạn không dùng using mà hãy để đâu đó để có thể tái sử dụng.
Nếu bạn không dùng using nhưng vẫn implement IDisposable, thì class của bạn phải implement finalize (có thể gọi là destructor) và finalize method có nghĩa vụ gọi Dispose.