wanshenmean
2026-03-13 770e9488fad76cdf987e6992f84ff4064b5afcfb
fix: address code quality issues in I/Q/T/C regions

- Add disposed checks to MemoryRegion base class Read/Write/Clear
- Add proper Dispose(bool) virtual method to MemoryRegion
- Remove redundant _disposed fields from I/Q regions
- Add timerNumber/counterNumber > 0 validation in T/C regions
- Add XML documentation to T/C region public methods
- Add overflow validation in T/C region constructors

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
已修改5个文件
171 ■■■■■ 文件已修改
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/CRegion.cs 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/IRegion.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/QRegion.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/TRegion.cs 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/CRegion.cs
@@ -11,11 +11,6 @@
    public class CRegion : MemoryRegion, IMemoryRegion
    {
        /// <summary>
        /// 标识对象是否已被释放
        /// </summary>
        private bool _disposed = false;
        /// <summary>
        /// 区域类型
        /// </summary>
        public override string RegionType => "C";
@@ -26,11 +21,24 @@
        private const int CounterSize = 2;
        /// <summary>
        /// 计数器数量
        /// </summary>
        public int CounterCount => Size / CounterSize;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="counterCount">计数器数量</param>
        /// <exception cref="ArgumentOutOfRangeException">当counterCount小于或等于0时抛出</exception>
        /// <exception cref="OverflowException">当counterCount * CounterSize超出int范围时抛出</exception>
        public CRegion(int counterCount) : base(counterCount * CounterSize)
        {
            if (counterCount <= 0)
                throw new ArgumentOutOfRangeException(nameof(counterCount), "计数器数量必须大于0");
            // 验证没有溢出
            if (counterCount > Size / CounterSize)
                throw new OverflowException($"计数器数量{counterCount}过大,超出内存限制");
        }
        /// <summary>
@@ -38,10 +46,15 @@
        /// </summary>
        /// <param name="counterNumber">计数器号(从1开始)</param>
        /// <returns>计数器值</returns>
        /// <exception cref="ArgumentOutOfRangeException">当counterNumber为0或超出计数器数量时抛出</exception>
        public ushort ReadCounter(ushort counterNumber)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(CRegion));
            if (counterNumber == 0)
                throw new ArgumentOutOfRangeException(nameof(counterNumber), "计数器号必须大于0(从1开始)");
            if (counterNumber > CounterCount)
                throw new ArgumentOutOfRangeException(nameof(counterNumber),
                    $"计数器号{counterNumber}超出范围,当前计数器总数为{CounterCount}");
            ushort offset = (ushort)((counterNumber - 1) * CounterSize);
            var data = Read(offset, CounterSize);
@@ -53,31 +66,19 @@
        /// </summary>
        /// <param name="counterNumber">计数器号(从1开始)</param>
        /// <param name="value">计数器值</param>
        /// <exception cref="ArgumentOutOfRangeException">当counterNumber为0或超出计数器数量时抛出</exception>
        public void WriteCounter(ushort counterNumber, ushort value)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(CRegion));
            if (counterNumber == 0)
                throw new ArgumentOutOfRangeException(nameof(counterNumber), "计数器号必须大于0(从1开始)");
            if (counterNumber > CounterCount)
                throw new ArgumentOutOfRangeException(nameof(counterNumber),
                    $"计数器号{counterNumber}超出范围,当前计数器总数为{CounterCount}");
            ushort offset = (ushort)((counterNumber - 1) * CounterSize);
            var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) };
            Write(offset, data);
        }
        /// <summary>
        /// 释放资源
        /// </summary>
        /// <param name="disposing">是否正在释放托管资源</param>
        protected override void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    // 释放托管资源
                }
                _disposed = true;
            }
            base.Dispose(disposing);
        }
    }
}
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/IRegion.cs
@@ -10,11 +10,6 @@
    public class IRegion : MemoryRegion, IMemoryRegion
    {
        /// <summary>
        /// 标识对象是否已被释放
        /// </summary>
        private bool _disposed = false;
        /// <summary>
        /// 区域类型
        /// </summary>
        public override string RegionType => "I";
@@ -35,9 +30,6 @@
        /// <returns>位状态(true/false)</returns>
        public bool ReadBit(ushort byteOffset, byte bitOffset)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(IRegion));
            if (bitOffset > 7)
                throw new ArgumentOutOfRangeException(nameof(bitOffset), "位偏移必须在0-7之间");
@@ -63,9 +55,6 @@
        /// <param name="value">位值(true/false)</param>
        public void WriteBit(ushort byteOffset, byte bitOffset, bool value)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(IRegion));
            if (bitOffset > 7)
                throw new ArgumentOutOfRangeException(nameof(bitOffset), "位偏移必须在0-7之间");
@@ -84,23 +73,6 @@
            {
                _lock.ExitWriteLock();
            }
        }
        /// <summary>
        /// 释放资源
        /// </summary>
        /// <param name="disposing">是否正在释放托管资源</param>
        protected override void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    // 释放托管资源
                }
                _disposed = true;
            }
            base.Dispose(disposing);
        }
    }
}
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs
@@ -49,6 +49,9 @@
        /// </summary>
        public virtual byte[] Read(ushort offset, ushort length)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(MemoryRegion));
            _lock.EnterReadLock();
            try
            {
@@ -71,6 +74,9 @@
        /// </summary>
        public virtual void Write(ushort offset, byte[] data)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(MemoryRegion));
            if (data == null)
                throw new ArgumentNullException(nameof(data));
@@ -94,6 +100,9 @@
        /// </summary>
        public virtual void Clear()
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(MemoryRegion));
            _lock.EnterWriteLock();
            try
            {
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/QRegion.cs
@@ -10,11 +10,6 @@
    public class QRegion : MemoryRegion, IMemoryRegion
    {
        /// <summary>
        /// 标识对象是否已被释放
        /// </summary>
        private bool _disposed = false;
        /// <summary>
        /// 区域类型
        /// </summary>
        public override string RegionType => "Q";
@@ -35,9 +30,6 @@
        /// <returns>位状态(true/false)</returns>
        public bool ReadBit(ushort byteOffset, byte bitOffset)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(QRegion));
            if (bitOffset > 7)
                throw new ArgumentOutOfRangeException(nameof(bitOffset), "位偏移必须在0-7之间");
@@ -63,9 +55,6 @@
        /// <param name="value">位值(true/false)</param>
        public void WriteBit(ushort byteOffset, byte bitOffset, bool value)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(QRegion));
            if (bitOffset > 7)
                throw new ArgumentOutOfRangeException(nameof(bitOffset), "位偏移必须在0-7之间");
@@ -84,23 +73,6 @@
            {
                _lock.ExitWriteLock();
            }
        }
        /// <summary>
        /// 释放资源
        /// </summary>
        /// <param name="disposing">是否正在释放托管资源</param>
        protected override void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    // 释放托管资源
                }
                _disposed = true;
            }
            base.Dispose(disposing);
        }
    }
}
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/TRegion.cs
@@ -11,11 +11,6 @@
    public class TRegion : MemoryRegion, IMemoryRegion
    {
        /// <summary>
        /// 标识对象是否已被释放
        /// </summary>
        private bool _disposed = false;
        /// <summary>
        /// 区域类型
        /// </summary>
        public override string RegionType => "T";
@@ -26,11 +21,24 @@
        private const int TimerSize = 2;
        /// <summary>
        /// 定时器数量
        /// </summary>
        public int TimerCount => Size / TimerSize;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="timerCount">定时器数量</param>
        /// <exception cref="ArgumentOutOfRangeException">当timerCount小于或等于0时抛出</exception>
        /// <exception cref="OverflowException">当timerCount * TimerSize超出int范围时抛出</exception>
        public TRegion(int timerCount) : base(timerCount * TimerSize)
        {
            if (timerCount <= 0)
                throw new ArgumentOutOfRangeException(nameof(timerCount), "定时器数量必须大于0");
            // 验证没有溢出
            if (timerCount > Size / TimerSize)
                throw new OverflowException($"定时器数量{timerCount}过大,超出内存限制");
        }
        /// <summary>
@@ -38,10 +46,15 @@
        /// </summary>
        /// <param name="timerNumber">定时器号(从1开始)</param>
        /// <returns>定时器值(毫秒)</returns>
        /// <exception cref="ArgumentOutOfRangeException">当timerNumber为0或超出定时器数量时抛出</exception>
        public ushort ReadTimer(ushort timerNumber)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(TRegion));
            if (timerNumber == 0)
                throw new ArgumentOutOfRangeException(nameof(timerNumber), "定时器号必须大于0(从1开始)");
            if (timerNumber > TimerCount)
                throw new ArgumentOutOfRangeException(nameof(timerNumber),
                    $"定时器号{timerNumber}超出范围,当前定时器总数为{TimerCount}");
            ushort offset = (ushort)((timerNumber - 1) * TimerSize);
            var data = Read(offset, TimerSize);
@@ -53,31 +66,19 @@
        /// </summary>
        /// <param name="timerNumber">定时器号(从1开始)</param>
        /// <param name="value">定时器值(毫秒)</param>
        /// <exception cref="ArgumentOutOfRangeException">当timerNumber为0或超出定时器数量时抛出</exception>
        public void WriteTimer(ushort timerNumber, ushort value)
        {
            if (_disposed)
                throw new ObjectDisposedException(nameof(TRegion));
            if (timerNumber == 0)
                throw new ArgumentOutOfRangeException(nameof(timerNumber), "定时器号必须大于0(从1开始)");
            if (timerNumber > TimerCount)
                throw new ArgumentOutOfRangeException(nameof(timerNumber),
                    $"定时器号{timerNumber}超出范围,当前定时器总数为{TimerCount}");
            ushort offset = (ushort)((timerNumber - 1) * TimerSize);
            var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) };
            Write(offset, data);
        }
        /// <summary>
        /// 释放资源
        /// </summary>
        /// <param name="disposing">是否正在释放托管资源</param>
        protected override void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    // 释放托管资源
                }
                _disposed = true;
            }
            base.Dispose(disposing);
        }
    }
}