シリアルポートクラスにアダプタパターン(ラッパー)があります。 IDisposableパターンを実装し、_wrappedSerialPort.Dispose()を呼び出す必要がありますか?私のクラスがあります、それは正しいのですか?.NETのSerialPortは管理されていないリソースですか?ラップされたクラスは正しいですか?
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();
これは正しい修正です、私はDispose()を十分に見ていませんでした。 –