gpt4 book ai didi

c# - 当父类也实现 IDisposable 时在子类上实现 IDisposable

转载 作者:IT王子 更新时间:2023-10-29 04:21:48 32 4
gpt4 key购买 nike

我有一个父类和子类都需要实现IDisposablevirtual(和 base.Dispose()?)调用应该在哪里发挥作用?当我只是重写 Dispose(bool disposing) 调用时,说我实现 IDisposable 而没有显式 Dispose() 函数感觉真的很奇怪(只利用继承的),但拥有其他一切。

我一直在做的事情(相当琐碎):

internal class FooBase : IDisposable
{
Socket baseSocket;

private void SendNormalShutdown() { }

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

private bool _disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
SendNormalShutdown();
}
baseSocket.Close();
}
}

~FooBase()
{
Dispose(false);
}
}

internal class Foo : FooBase, IDisposable
{
Socket extraSocket;

private bool _disposed = false;
protected override void Dispose(bool disposing)
{
if (!_disposed)
{
extraSocket.Close();
}
base.Dispose(disposing);
}

~Foo()
{
Dispose(false);
}

}

最佳答案

When I just override the Dispose(bool disposing) call, it feels really strange stating that I implement IDisposable without having an explicit Dispose() function (just utilizing the inherited one), but having everything else.

这是你不应该关心的事情。

当您对 IDisposable 类进行子类化时,基类已经为您处理了所有“Dispose 模式”管道。除了重写 protected Dispose(bool) 方法,您真的什么都不应该做,并跟踪您是否已经被处置(以正确引发 ObjectDisposedException。)

有关详细信息,请参阅我在 Subclassing from an IDisposable class 上的博客文章.


此外,考虑封装 IDisposable 类而不是子类化通常是个好主意。有时对 IDisposable 类进行子类化是合适的,但这种情况很少见。封装通常是更好的选择。

关于c# - 当父类也实现 IDisposable 时在子类上实现 IDisposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2496311/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com