【发布时间】:2016-03-22 13:20:28
【问题描述】:
我有一个实现 C# SerialPort 的类,它曾经看起来像这样:
public class AsyncSerial : IDisposable
{
SerialPort newPort; //Parameters declared in my constructor
//Constructor and other methods
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(disposing)
{
this.Close();
this.Dispose();
}
}
}
这不会在代码分析中引发任何警告(我从MSDN 获得代码作为如何正确执行此操作的示例)。
因为我只打算声明一个 SerialPort,所以我想我会让我的班级成为 SerialPort 的孩子,但现在我收到了似乎无法修复的警告。
public class AsyncSerial : SerialPort
{
//Constructor and other methods
public new void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected new virtual void Dispose(bool disposing)
{
if(disposing)
{
this.Close();
this.Dispose();
}
}
}
代码警告说 dispose 方法应该是new,因为它们隐藏了成员,我这样做了,但我也得到了:
“警告 CA1063 确保 'AsyncSerial.Dispose()' 被声明为公共和密封”
将其密封意味着必须将其标记为override(否则我会遇到编译器错误),使其覆盖意味着它可以是新的,所以我最终得到:
错误 CS0506“AsyncSerial.Dispose()”:无法覆盖继承的成员“Component.Dispose()”,因为它未标记为虚拟、抽象或覆盖
我不知道在父类中使用 IDisposable 的类上实现处置的“正确”方法。我发现的每一个例子都只适合以IDisposable 为基础,但是让我的类
public class AsyncSerial : SerialPort, IDisposable
{
//code
}
给我一个代码分析警告,因为SerialPort 已经实现了IDisposable。
我是否应该取消有关确保“AsyncSerial.Dispose()”被声明为公共和密封的警告,或者是否有正确的方法来执行此操作而不给出代码分析警告。
【问题讨论】:
-
嵌入 SerialPort 很好,但您只需要在 Dispose() 方法中处理它,不需要其他任何东西,也不需要一次性模式。毫不犹豫地使用密封。继承也很好,但是您需要仅 覆盖 Dispose(bool) 而不是继承 IDisposable。因为您似乎没有其他不必要的一次性用品。
标签: c# design-patterns idisposable