Ich arbeite an einem großen Projekt in C# .NET 4.0. Es gibt eine benutzerdefinierte Klasse, die von der Klasse System.Net.Sockets.SocketAsyncEventArgs geerbt wurde. Etwas wie folgt aus:Wie IDisposable-Schnittstelle in einer Klasse implementiert, die von SocketAsyncEventArgs geerbt wird
public class SocketTaskArgs : SocketAsyncEventArgs
{
public SocketTaskArgs()
{
Completed += someEventhHandler;
}
public void CleanUp()
{
Completed -= someEventhHandler;
}
/*
There is a lot of code here that is unimportant at the moment.
*/
}
So wollte ich den Inhalt von CleanUp() -Methode bewegen Verfügungs (bool) -Methode.
Als erstes, überprüfte ich den Quellcode der Basisklasse - SocketAsyncEventArgs (mit Go To Definition so dass ich Metadaten als Quelle gesehen). Ich fand heraus, diese Klasse implementiert IDisposable-Schnittstelle. Schön, ich muss nur die Dispose (bool) -Methode außer Kraft setzen, oder? (Siehe "IDisposable Interface on MSDN", "IDisposable und die Vererbungshierarchie" für weitere Details). Nichts Neues für mich ... Leider ist die SocketAsyncEventArgs Klasse wie folgt umgesetzt:
public class SocketAsyncEventArgs : EventArgs, IDisposable
{
public void Dispose();
//some other stuff here
}
Das heißt, es gibt keinen Weg, wie Dispose (bool) Methode außer Kraft zu setzen, da es als privaten implementiert ist statt von geschützt ... Was ist der Grund dafür?
Als nächstes lese ich über SocketAsyncEventArgs.Dispose() Methode auf MSDN. Das Komische ist, dass es den folgenden Abschnitt enthält:
Hinweise
Entsorgen zur Vererbung kann mehrfach von anderen Objekte aufgerufen werden. Beim Überschreiben Dispose (Boolean), seien Sie vorsichtig, keine Objekte zu referenzieren, die zuvor in einem früheren Anruf zu Dispose entsorgt wurden. Weitere Informationen zum Implementieren von Dispose (Boolean), finden Sie unter Implementieren einer Dispose-Methode.
Warten ... was?
Wenn zwingende Dispose (Boolean), ...
Wie soll ich Dispose (Boolean) außer Kraft zu setzen?
Was ist die empfohlene Methode zur Implementierung der IDisposable-Schnittstelle in diesem Fall?
Es ist nicht privat, es ist überhaupt nicht implementiert (siehe http://referencesource.microsoft.com/System/net/System/Net/Sockets/Socket.cs.html#8877). Es verwendet einen Finalizer, sieht aber so aus, als ob er nicht im empfohlenen Muster implementiert wurde. –
Es scheint, als wäre "Dispose" öffentlich, nur nicht "virtuell". –
Sie sollen nicht von dieser Klasse erben. Das kann man in einem großen bestehenden Projekt wahrscheinlich nicht so einfach ändern. – usr