我有SerialPort
我用来连接虚拟COM端口。由于连接是持久的,我必须保留对SerialPort
的引用,以便打开,关闭和以其他方式管理端口。我也在我的类上实现IDisposable
(不是完整的Dispose模式,因为我实际上没有任何适当的非托管资源,只有SerialPort
)。
我的问题与SerialPort.Dispose()
vs SerialPort.Close()
的使用有关。我在几个地方使用Close()
,我从文档中了解到这会调用Dispose()
上的SerialPort
方法。但是,如果在我的TryConnect()
方法中,SerialPort
可能永远不会被打开,那该怎么办?我应该简单地拨打Dispose()
,并将其留在那里吗?或者Close()
方法是更好的选择吗?
更广泛地说,使用这些方法之一总是一个好主意吗?
我的代码中的一些相关摘要如下所示。
public bool TryConnect() {
CheckDisposed();
try {
connectedPort = new SerialPort(SelectedPort);
connectedPort.WriteTimeout = 1000;
connectedPort.DataReceived += P_DataReceived;
connectedPort.Open();
return true;
} catch (Exception e) {
if (connectedPort != null) {
connectedPort.Dispose();
connectedPort = null;
}
return false;
}
}
public void Disconnect() {
CheckDisposed();
if (connectedPort != null) {
connectedPort.Close();
connectedPort = null;
}
}
public void Dispose() {
if (!disposed) {
if (connectedPort != null) {
connectedPort.Close();
connectedPort = null;
}
disposed = true;
}
}
答案 0 :(得分:2)
致电Close
等于致电Dispose(true)
https://github.com/Microsoft/referencesource/blob/master/System/sys/system/IO/ports/SerialPort.cs
// Calls internal Serial Stream's Close() method on the internal Serial Stream.
public void Close()
{
Dispose();
}
protected override void Dispose( bool disposing )
{
if( disposing ) {
if (IsOpen) {
internalSerialStream.Flush();
internalSerialStream.Close();
internalSerialStream = null;
}
}
base.Dispose( disposing );
}
答案 1 :(得分:2)
Close
与此类的Dispose
相同。使用ILSpy,这是Close
方法的代码:
public void Close()
{
base.Dispose();
}