我在C#.NET 4.0中处理一个巨大的项目。有一个继承自System.Net.Sockets.SocketAsyncEventArgs类的自定义类。类似以下内容:如何在继承自SocketAsyncEventArgs的类中实现IDisposable接口
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.
*/
}
所以,我想将CleanUp()方法的内容移到Dispose(bool)方法。首先,我检查了基类 - SocketAsyncEventArgs的源代码(使用转到定义,以便我看到元数据作为源)。我发现,这个类实现了IDisposable接口。很好,我只需要重写Dispose(bool)方法,不是吗? (有关更多详细信息,请参见IDisposable Interface on MSDN,“IDisposable”和“继承层次”部分)。对我来说没有什么新的......不幸的是,让SocketAsyncEventArgs类实现如下:
public class SocketAsyncEventArgs : EventArgs, IDisposable
{
public void Dispose();
//some other stuff here
}
这意味着,有没有办法如何覆盖的Dispose(布尔)方法,因为它是作为私人代替实施保护 ... 这是什么原因?
接下来,我读了关于在MSDN上的SocketAsyncEventArgs.Dispose()方法。有趣的是,它包含以下内容:
给继承
处置可以通过其他 对象可以多次调用。当覆盖配置(布尔型)时,请注意不要参考 之前已在之前处理过的对象中处理过的对象 处置。有关如何实施Dispose(布尔型), 的更多信息,请参阅实施处置方法。
等等......什么?
当重写的Dispose(布尔) ...
我怎么重写的Dispose(布尔)?
什么是落实在这种情况下IDisposable接口是推荐的方式?
它不是私有的,它根本没有实现(请参阅http://referencesource.microsoft.com/System/net/System/Net/Sockets/Socket.cs.html#8877)。它确实使用了终结器,但看起来并没有在推荐模式中实现。 –
它看起来像'Dispose'是公开的,而不是'虚拟'。 –
你不应该从该类继承。在现有大型项目中,您可能无法轻松改变这一点。 – usr