Tôi đã hỏi một câu hỏi liên quan đến returning a Disposable (IDisposable
) object from a function, nhưng tôi nghĩ rằng tôi sẽ thảo luận nếu tôi nêu câu hỏi này ở đó.Tôi hoàn toàn không hiểu hoạt động của việc sử dụng/Các đối tượng dùng một lần
Tôi tạo ra một số mẫu mã:
class UsingTest
{
public class Disposable : IDisposable
{
public void Dispose()
{
var i = 0;
i++;
}
}
public static Disposable GetDisposable(bool error)
{
var obj = new Disposable();
if (error)
throw new Exception("Error!");
return obj;
}
}
tôi mã hoá nó theo cách này cố ý, bởi vì sau đó tôi gọi:
using (var tmp = UsingTest.GetDisposable(true)) { }
Sử dụng trình gỡ lỗi, tôi nhận thấy rằng phương pháp Dispose
không bao giờ thực hiện, thậm chí mặc dù chúng tôi đã khởi tạo một đối tượng Disposable
. Nếu tôi hiểu chính xác mục đích của Dispose
, nếu lớp học này thực sự đã mở tay cầm và tương tự, thì chúng tôi sẽ không đóng chúng ngay sau khi chúng tôi kết thúc với chúng.
Tôi đặt câu hỏi này vì hành vi này phù hợp với những gì tôi mong đợi, nhưng trong câu trả lời cho câu hỏi liên quan, mọi người dường như chỉ ra rằng using
sẽ xử lý mọi thứ.
Nếu using
vẫn bằng cách nào đó sẽ xử lý tất cả những điều này, ai đó có thể giải thích những gì tôi đang thiếu? Nhưng, nếu mã này thực sự có thể gây ra rò rỉ tài nguyên, làm thế nào bạn sẽ đề nghị tôi mã GetDisposable
(với điều kiện mà tôi phải nhanh chóng đối tượng IDisposable
và chạy mã mà có thể ném một ngoại lệ trước khi tuyên bố trở lại)?
là chính xác. Nếu phương thức tạo IDisposable có thể thất bại trước khi trả về tham chiếu, nó có trách nhiệm đảm bảo rằng việc vứt bỏ được gọi. – ScottS