2009-01-31 29 views
7

Trong ASP.NET nếu các mục còn lại trong trạng thái phiên thực hiện IDisposable nhưng không bao giờ được gỡ bỏ và xử lý bởi ứng dụng khi hết hạn sẽ hủy bỏ được gọi trên các đối tượng mà bất kỳ mã nào trong Dipose () sẽ thực thi?Phiên chứa các mục thực hiện IDisposable

+0

Câu trả lời khác cho câu hỏi này: http://stackoverflow.com/q/12347044/11683 – GSerg

Trả lời

2

Nếu mẫu IDisposableimplemented properly, thì có (nghĩa là destructor của lớp sẽ xử lý việc vứt bỏ đối tượng). Tôi không tin người quản lý phiên ASP.NET thực hiện bất kỳ sự bảo đảm nào về việc gọi một cách rõ ràng Dispose() trên các lớp thực hiện IDisposable.

Lưu ý rằng mặc dù phản đối tích cực của Mark, tôi không đề xuất "thường xuyên" thêm trình kết thúc. Tôi chỉ đơn giản gợi ý rằng nếu bạn muốn phương thức Dispose trên đối tượng của bạn được gọi khi phiên hết hạn, đây là tùy chọn khả thi.

+2

Trình kết thúc là * không * triển khai IDisposable chính xác; thay vào đó, một cái gì đó với một finalizer thường có thể được IDisposable. Nhưng một đối tượng IDisposable không nên có một finalizer chỉ vì nó là IDisposable. –

+0

Tôi không nghĩ rằng đó là "hung hăng" - đơn giản là một finalizer không có gì để làm với liệu IDisposable được "thực hiện đúng" –

+0

Tôi muốn để lại một bình luận tiêu cực về câu trả lời của tôi, xuyên tạc câu trả lời của tôi, và tạo câu trả lời của riêng bạn nhắc lại sự không đồng ý của bạn đủ tiêu chuẩn là 'phản đối tích cực'. Bất kỳ một trong số đó sẽ là đủ trong và của chính họ. Tôi đoán chúng ta cũng sẽ không đồng ý với điều này nữa. –

10

Tôi không đồng ý với câu trả lời của Sean; trước hết, finalizers nên không thường xuyên được thêm vào các lớp, ngay cả khi chúng là IDisposable - finalizers chỉ nên thực sự được sử dụng trong các lớp đại diện cho tài nguyên không được quản lý. Ngược lại, một lớp học với một finalizer thường là IDisposable.

Câu hỏi: là Dispose() được gọi - không, không phải vậy. Các đối tượng sẽ được thu gom rác tại một số điểm trong tương lai (không xác định), nhưng đó là về nó. Một finalizer sẽ không thêm nhiều ở đây, vì bất kỳ đối tượng đóng gói nào cũng sẽ đủ điều kiện để thu thập (giả sử rằng chúng không được tham chiếu ở nơi khác).

1

Tôi muốn được quan tâm để có các đối tượng Dùng một lần trong Phiên. Nó gần như chắc chắn sẽ tạo ra một vấn đề khả năng mở rộng cho bạn. Bất kỳ thứ gì dùng một lần có thể được kết nối với một số tài nguyên hạn chế, nếu bạn có nhiều phiên hoạt động, bạn có khả năng sử dụng tài nguyên đó. Thứ hai, tôi hy vọng rằng nhiều đối tượng dùng một lần sẽ không hoạt động tốt trong một trang trại vì tài nguyên mà chúng được gắn với có thể là cục bộ cho một máy duy nhất và chúng sẽ không tuần tự hóa và sau đó deserialize trên một máy khác trong cùng một tiểu bang.

Các vấn đề liên quan