2015-01-16 4 views
1

У меня есть этот код, который работает:Strange 'Dispose' при вызове с 'помощью' или прямого вызова 'Dispose'

Option Strict On 
Imports System 
Imports System.IO 
Imports System.ServiceModel 
Imports System.ServiceModel.Description 
... 
Private Property Channel As IWSOServiceContract 

Public Sub SomeMethod(ByVal url As String) 
    Using ChlFactory As ChannelFactory(Of IWSOServiceContract) = New ChannelFactory(Of IWSOServiceContract)(New WebHttpBinding(), url) 
     ChlFactory.Endpoint.Behaviors.Add(New WebHttpBehavior()) 
     Channel = ChlFactory.CreateChannel() 
    End Using 
End Sub 
... 

Но тогда, когда я рефакторинг его:

Option Strict On 
Imports System 
Imports System.IO 
Imports System.ServiceModel 
Imports System.ServiceModel.Description 
... 
Private Property ChlFactory As ChannelFactory(Of IWSOServiceContract) 
Private Property Channel As IWSOServiceContract 

Public Sub SomeMethod(ByVal url As String) 
    ChlFactory = New ChannelFactory(Of IWSOServiceContract)(New WebHttpBinding(), url) 
    ChlFactory.Endpoint.Behaviors.Add(New WebHttpBehavior()) 
    Channel = ChlFactory.CreateChannel() 
    ChlFactory.Dispose() '<-- ERROR HERE BUT HOW DID USING WORK BEFORE? 
End Sub 
... 

Am полностью в убытке без объяснения причин ошибки «Dispose не является членом ChannelFactory» во втором методе, но не в первом методе?

+0

Какая ошибка? –

+0

Ошибка 'Dispose' не является членом 'System.ServiceModel.ChannelFactory (Of IWSOServiceContract)'. – Denis

ответ

3

Это потому, что ChannelFactory implements IDisposable.Dispose explicitly. Вам нужно будет отправить его на номер IDisposable, чтобы позвонить по телефону Dispose.

Using заявление достаточно умен, чтобы сделать кастинг для вас.

+0

Интересно ... никогда раньше не видел такого случая. Я думаю, именно поэтому R # говорит: «Не могу получить доступ к Private Dispose здесь», когда я наводил на него курсор. Так почему же частный метод внезапно становится общедоступным, если вы добавили в IDisposable? – Denis

+2

Вот как работает явная реализация интерфейса. Вы внедряете член интерфейса, но для доступа к нему вызывающий должен рассматривать вас как этот экземпляр интерфейса, а не конкретный класс. Это полезно, если вы хотите иметь другой метод с тем же именем и набором параметров и другого типа (например, 'GetEnumerator' на' List ', делается так, их три, один для 'IEnumerable', другой для' IEnumerable 'и еще один, который не поддерживается каким-либо интерфейсом) или реализовать несколько интерфейсов с одним и тем же членом, и вы хотите реализовать их по-разному. – MarcinJuraszek

+0

Спасибо. Очень просветительская. Никогда не видел этого случая раньше. – Denis

Смежные вопросы