Không dùng Using trong Function

Chào các bạn,

Em có 1 vấn đề muốn hỏi. Khi chúng ta viết 1 function nào đó khởi tạo 1 đối tượng. Khi không dùng nữa thì chúng ta phải hủy nó đi vậy nên trong mỗi funtion chúng ta phải dùng using để khi dùng xong nó tự hủy cho mình.

Như vậy, nếu có 100 funtion đều viết 100 cái using. Có cách nào đơn giản k vậy mọi người.

Thanks mọi người.

code đâu bạn? dùng using để hủy là sao nhỉ?

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)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.

2 Likes

Theo như mình hiểu, Bình thường thì C# có cơ chế tự thu gom rác Garbage Collection nhưng cái này chỉ sử dụng đối vối những thành phần Manage Code (những thành phần nằm trong .Net Framework) còn đối với những thành phần không nằm trong .Net Framework gọi là Unmanage Code (Đọc ghi file, Kết nối tới DB …) thì mình phải tự giải phóng bộ nhớ khi dùng xong. Nên khi mà mình dùng “Using” thì khi kết thúc nó sẽ tự động gọi đến hàm Dispose mà mình đã định nghĩa trước mà mình không phải tự xữ lý hay tự check. Và để làm được việc này thì class mình phải implement IDisposable interface.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?