2013-05-08 12 views
6

ich eine Klasse mit diesem Bereich haben:Warum ist die Dispose() -Methode für mein IDisposable-Objekt nicht verfügbar?

private WcfChannelFactory<IPrestoService> _channelFactory; 

Im Dispose() Methode, mache ich das:

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

Aber das erzeugt einen Fehler:

Cannot access explicit implementation of IDisposable.Dispose

Nachdem ich einige research, es scheint, dass ich auf diese Weise entsorgen kann:

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

verstehe ich nicht zwei Dinge:

  1. Warum ist nicht Dispose() verfügbar? WcfChannelFactory<T> leitet sich von ChannelFactory<T> ab, das von ChannelFactory abgeleitet ist, das IDisposable implementiert. Doch ChannelFactory hat keine Dispose() Methode. Wie ist das möglich?

  2. Wenn ich könnte (sollte?) Einfach Close() auf _channelFactory nennen, warum nicht die XML-Dokumentation fest, dass Close() auch Dispose() nennen? Vielleicht wird es nicht? Das ist verwirrend.

Antwort

7
  1. Da die Dispose Methode explicilty für die IDisposable Schnittstelle implementiert ist, können Sie nur die Methode sehen, wenn Sie einen Verweis des IDisposable Typ. Die Methode ist dort, aber Sie können sie nicht sehen, wenn Sie eine Referenz eines anderen Typs haben. Es ist ähnlich wie eine private Methode nur aus Code innerhalb der Klasse selbst sichtbar ist, obwohl sie immer da ist.

  2. Die Close-Methode ruft Dispose für diese Klasse nicht auf. Die Methode schließt die Factory nicht, sie startet einen asynchronen Closing-Prozess. Wenn die Methode Close beendet wird, wird der Abschlussvorgang nicht abgeschlossen, sodass das Objekt zu diesem Zeitpunkt nicht entfernt werden kann.

+0

Wie soll ich von '_channelFactory' entsorgen? Soll ich 'Close()' nennen? Soll ich 'Dispose()' nennen? –

+0

@Bob, vergiss es. Deine ursprüngliche Frage falsch gelesen. Sieht so aus, als würden Sie Ihr eigenes Wegwerfmuster implementieren. –

+0

@AnthonyPegram Ich kann nicht. Die Methode gibt '_channelFactory' zurück. Der Konsument wickelt den Aufruf in ein "using" ein, so dass meine Klasse "IDiposable" implementieren und dipieren muss. –

2

Dispose Die Methode wurde als explizites Mitglied der Schnittstelle IDisposable implementiert. Das heißt, sieht die Definition etwas wie folgt aus:

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

Tutorial: Explicit Interface Implementation Tutorial

+0

Ich weiß, was explizite Schnittstellenimplementierung ist. Vielen Dank! –