Lavoro su un enorme progetto in C# .NET 4.0. Esiste una classe personalizzata ereditata dalla classe System.Net.Sockets.SocketAsyncEventArgs. Qualcosa di simile a quanto segue:Come implementare l'interfaccia IDisposable in una classe ereditata da SocketAsyncEventArgs
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.
*/
}
Così, ho voluto spostare il contenuto del metodo di cleanup() per smaltire il metodo (bool).
Come prima cosa, ho controllato il codice sorgente della classe base - SocketAsyncEventArgs (utilizzando Vai a definizione in modo che i metadati siano stati visualizzati come origine). Ho scoperto che questa classe implementa l'interfaccia IDisposable. Bello, ho solo bisogno di sovrascrivere il metodo Dispose (bool), no? (Vedere IDisposable Interface on MSDN, la sezione "IDisposable e gerarchia ereditarietà", per ulteriori dettagli). Niente di nuovo per me ... Purtroppo, la classe SocketAsyncEventArgs è implementato come seguendo:
public class SocketAsyncEventArgs : EventArgs, IDisposable
{
public void Dispose();
//some other stuff here
}
Ciò significa che, non c'è modo come ignorare Dispose (bool) metodo, come è implementato come privato invece di protetto ... Qual è la ragione di questo?
Successivamente, ho letto il metodo SocketAsyncEventArgs.Dispose() su MSDN. La cosa divertente è che, contiene la seguente sezione:
Note per gli eredi
Smaltire possono essere chiamati più volte da altri oggetti. Quando si esegue l'override di Dispose (Boolean), fare attenzione a non fare riferimento agli oggetti che sono stati precedentemente smaltiti in una precedente chiamata a Dispose. Per ulteriori informazioni su come implementare Dispose (Boolean), , vedere Implementazione di un metodo di smaltimento.
Aspetta ... cosa?
Quando si esegue l'override Dispose (Boolean), ...
Come faccio a ignorare Dispose (Boolean)?
Qual è il modo consigliato di implementare l'interfaccia IDisposable in questo caso?
Non è privato, non è implementato affatto (consultare http://referencesource.microsoft.com/System/net/System/Net/Sockets/Socket.cs.html#8877). Usa un finalizzatore ma sembra che non sia stato realmente implementato nel modello raccomandato. –
Sembra che 'Dispose' sia pubblico, ma non' virtuale'. –
Non si dovrebbe ereditare da quella classe. Probabilmente non puoi cambiarlo facilmente in un grande progetto esistente. – usr