wanshenmean
2026-03-13 0638edbbbb5b6a3aa09f5272ce879b1bf3903dee
fix: improve memory region code quality

- Add null validation for Write data parameter
- Specify LockRecursionPolicy.SupportsRecursion for virtual methods
- Implement full IDisposable pattern
- Make IMemoryRegion inherit from IDisposable

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
已修改2个文件
33 ■■■■ 文件已修改
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs
@@ -3,7 +3,7 @@
    /// <summary>
    /// 内存区域接口
    /// </summary>
    public interface IMemoryRegion
    public interface IMemoryRegion : IDisposable
    {
        /// <summary>
        /// 区域类型(M/DB/I/Q/T/C)
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs
@@ -19,6 +19,11 @@
        protected readonly ReaderWriterLockSlim _lock;
        /// <summary>
        /// 释放状态标志
        /// </summary>
        protected bool _disposed = false;
        /// <summary>
        /// 区域类型
        /// </summary>
        public abstract string RegionType { get; }
@@ -36,7 +41,7 @@
        {
            Size = size;
            _memory = new byte[size];
            _lock = new ReaderWriterLockSlim();
            _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
        }
        /// <summary>
@@ -66,6 +71,9 @@
        /// </summary>
        public virtual void Write(ushort offset, byte[] data)
        {
            if (data == null)
                throw new ArgumentNullException(nameof(data));
            _lock.EnterWriteLock();
            try
            {
@@ -100,9 +108,26 @@
        /// <summary>
        /// 释放资源
        /// </summary>
        public virtual void Dispose()
        public void Dispose()
        {
            _lock?.Dispose();
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        /// <summary>
        /// 释放资源
        /// </summary>
        /// <param name="disposing">是否正在释放托管资源</param>
        protected virtual void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    _lock?.Dispose();
                }
                _disposed = true;
            }
        }
    }
}