Với ngoại lệ tương đối ít (hầu hết các trường hợp có thể được mô tả là phương pháp tối thiểu để xử lý mã không được thiết kế kém), mỗi trường hợp IDisposable
nên tại bất kỳ thời điểm cụ thể nào chủ sở hữu được xác định rõ. Trong trường hợp một phương thức trả về một cái gì đó của một loại thực hiện IDisposable
, hợp đồng cho phương thức sẽ chỉ rõ liệu phương thức có từ bỏ quyền sở hữu hay không. từ bỏ quyền sở hữu cho người khác), hoặc liệu phương pháp chỉ đơn thuần là trả về một tham chiếu đến một đối tượng được sở hữu bởi một người khác.
Trong mã được viết đúng cách, câu hỏi có hay không một đối tượng cần được xử lý hiếm khi là cuộc gọi phán quyết. Chủ sở hữu của một đối tượng phải đảm bảo rằng nó được xử lý; không ai khác nên vứt bỏ nó. Thỉnh thoảng, có thể cần phải có phương thức chấp nhận tham số cho biết liệu phương thức có nên chuyển quyền sở hữu của một số IDisposable
hay không. Ví dụ: nếu mã muốn tạo âm thanh, hãy chuyển âm thanh đó sang phương thức "bắt đầu phát âm thanh" và không bao giờ muốn xử lý lại âm thanh đó, có thể thuận tiện nhất để mã phát âm thanh chấp nhận và vứt bỏ âm thanh khi nó được thực hiện; nếu mã muốn có thể phát âm thanh nhiều lần, tuy nhiên, và sẽ đảm bảo rằng đối tượng âm thanh sẽ vẫn hoạt động miễn là cần thiết, nó sẽ thuận tiện hơn cho mã phát âm để không chiếm quyền sở hữu. Sử dụng các phương pháp riêng biệt có thể theo một số cách được sạch hơn, nhưng sử dụng một tham số có thể hỗ trợ đóng gói.
Nói chung, khi mã trả về danh sách đối tượng triển khai IDisposable
, mục đích của mã là xác định các đối tượng mà không truyền đạt bất kỳ quyền sở hữu nào đối với chúng. Trong trường hợp không có quyền sở hữu, mã nhận danh sách như vậy phải không phải gọi Dispose
trên đó.
Không có cách nào để 'Người sáng tạo' vứt bỏ chúng hoặc các bộ phận bên trong các lớp đó vì không có destructor. Họ không có quyền kiểm soát của bạn thiết lập một biến để không có gì để sau đó xử lý có đối tượng hoặc nội dung mà yêu cầu xử lý. – OneFineDay
Chắc chắn, bạn có thể, cho Process.GetProcesses() bạn có thể giữ một mảng nội bộ của tất cả các đối tượng Process() mà bạn đã quay trở lại với người gọi và sau đó kiểm tra định kỳ nếu bạn là người duy nhất có tham chiếu đến đối tượng và nếu có Vứt bỏ() – Denis
@Denis Xác định xem có ai khác có liên quan đến nó không phải là điều bạn thực sự có thể làm không. – Servy