2013-05-08 34 views
6

Tôi có một lớp học với lĩnh vực này:Tại sao phương thức Dispose() không có sẵn trên đối tượng IDisposable của tôi?

private WcfChannelFactory<IPrestoService> _channelFactory; 

Trong phương pháp Dispose(), tôi đang làm điều này:

if (_channelFactory != null) { _channelFactory.Dispose(); } 

Nhưng điều đó tạo ra một lỗi:

Cannot access explicit implementation of IDisposable.Dispose

Sau khi thực hiện một số research, có vẻ như tôi có thể vứt bỏ theo cách này:

if (_channelFactory != null) { (_channelFactory as IDisposable).Dispose(); } 

Tôi không hiểu hai điều:

  1. Tại sao không phải là Dispose() sẵn? WcfChannelFactory<T> có nguồn gốc từ ChannelFactory<T>, xuất phát từ ChannelFactory, triển khai IDisposable. Tuy nhiên, ChannelFactory không có phương thức Dispose(). Sao có thể như thế được?

  2. Nếu tôi có thể (nên?) Chỉ cần gọi Close() trên _channelFactory, tại sao nhà nước không phải là tài liệu XML Close() cũng sẽ gọi Dispose()? Có lẽ nó sẽ không? Điều này là khó hiểu.

Trả lời

7
  1. Là phương pháp Dispose được thực hiện explicilty cho giao diện IDisposable, bạn chỉ có thể xem phương pháp này khi bạn có một tài liệu tham khảo của các loại IDisposable. Phương thức có ở đó, nhưng bạn không thể nhìn thấy nó khi bạn có một tham chiếu của một kiểu khác. Nó tương tự như cách một phương thức riêng tư chỉ hiển thị từ mã trong chính lớp đó, mặc dù nó luôn ở đó.

  2. Phương pháp Close sẽ không gọi Dispose cho lớp học này. Phương pháp này không đóng nhà máy, nó bắt đầu một quá trình đóng không đồng bộ. Khi lối ra phương pháp Close, quy trình đóng chưa hoàn tất, do đó đối tượng không thể được xử lý tại thời điểm đó.

+0

Vậy làm thế nào tôi phải vứt bỏ của '_channelFactory'? Tôi có nên gọi 'Close() '? Tôi có nên gọi là 'Vứt bỏ()'? –

+0

@Bob, nevermind. Đã hiểu sai câu hỏi ban đầu của bạn. Có vẻ như bạn đang triển khai mẫu dùng một lần của riêng mình. –

+0

@AnthonyPegram Tôi không thể. Phương thức trả về '_channelFactory'. Người tiêu dùng đang gói các cuộc gọi trong một 'sử dụng' để lớp của tôi cần phải thực hiện' IDiposable' và dipose của nó. –

2

Phương pháp Dispose được thực hiện như một thành viên rõ ràng của giao diện IDisposable. Đó là, định nghĩa trông giống như sau:

public class WcfChannelFactory<T> : IDisposable 
{ 
    public void IDisposable.Dispose() 
    { 
     ... 
    } 
} 

Hướng dẫn: Explicit Interface Implementation Tutorial

+0

Tôi biết việc triển khai giao diện rõ ràng là gì. Cảm ơn! –

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