gpt4 book ai didi

c# - .NET 中的 SerialPort 是非托管资源吗?我的包装类是否正确?

转载 作者:太空狗 更新时间:2023-10-29 20:06:04 26 4
gpt4 key购买 nike

我在串行端口类上有适配器模式(包装器)。我应该实现 IDisposable 模式并在其中调用 _wrappedSerialPort.Dispose() 吗?有我的课,对吗?

public class SerialPortAdapter : ISerialPortAdapter
{
private bool _disposed;

public event SerialDataReceivedEventHandler DataReceived;

private readonly SerialPort _wrappedSerialPort;

public SerialPort WrappedSerialPort
{
get { return _wrappedSerialPort; }
}

public string PortName
{
get { return _wrappedSerialPort.PortName; }
set { _wrappedSerialPort.PortName = value; }
}

public BaudRate BaudRate
{
get { return (BaudRate)Enum.ToObject(typeof(BaudRate), _wrappedSerialPort.BaudRate); }
set { _wrappedSerialPort.BaudRate = (int)value; }
}

public bool IsOpen
{
get { return WrappedSerialPort.IsOpen; }
}

public SerialPortAdapter(SerialPort serialPort)
{
_wrappedSerialPort = serialPort;
_wrappedSerialPort.DataReceived += SerialPortDataReceived;
}

public void OpenPort()
{
if (!_disposed)
{
if (!WrappedSerialPort.IsOpen)
{

WrappedSerialPort.Open();

}
}
}


public void ClosePort()
{
if (!_disposed)
{
if (WrappedSerialPort.IsOpen)
{

WrappedSerialPort.Close();

}
}
}


public void WriteLine(string request)
{
...
}


public void Write(byte[] request)
{
....
}


public byte[] Read()
{
....
}


public string ReadLine()
{
...
}


private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (DataReceived != null)
{
DataReceived(this, e);
}
}

#region IDisposable Members

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

private void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// Dispose managed resources.

}
// Dispose unmanaged resources.

ClosePort();
WrappedSerialPort.DataReceived -= SerialPortDataReceived;
_wrappedSerialPort.Dispose();

_disposed = true;

}
}

~SerialPortAdapter()
{

Dispose(false);
}

#endregion
}

编辑:是否有必要调用它,或者仅调用 _wrappedSerialPort.Dispose(); 就足够了?

        ClosePort();
WrappedSerialPort.DataReceived -= SerialPortDataReceived;
_wrappedSerialPort.Dispose();

最佳答案

Henk Holterman 的回答是正确的:SerialPort 是一种托管资源,它本身拥有一个非托管资源,因此实现了 IDisposable

由于您的包装器拥有一个 SerialPort,它间接拥有 SerialPort 的非托管资源,因此必须实现 IDisposable。您的实现是错误的,只有当 disposing 为 true 时,才应释放拥有的 SerialPort 实例,因为它是托管资源。

应该实现如下:

   private void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// Dispose managed resources.
ClosePort();
WrappedSerialPort.DataReceived -= SerialPortDataReceived;
_wrappedSerialPort.Dispose();
}
_disposed = true;
}
}

此外,正如 Henk Holterman 指出的那样,只有当您直接拥有非托管资源时才需要一个析构函数,而这里不是这种情况,您可以通过摆脱析构函数来简化 IDisposable 实现.

关于c# - .NET 中的 SerialPort 是非托管资源吗?我的包装类是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4826702/

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