From 0638edbbbb5b6a3aa09f5272ce879b1bf3903dee Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 13 三月 2026 12:35:57 +0800
Subject: [PATCH] fix: improve memory region code quality

---
 Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs      |   31 ++++++++++++++++++++++++++++---
 Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs |    2 +-
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs
index 990ecf5..88b6606 100644
--- a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs
@@ -3,7 +3,7 @@
     /// <summary>
     /// 鍐呭瓨鍖哄煙鎺ュ彛
     /// </summary>
-    public interface IMemoryRegion
+    public interface IMemoryRegion : IDisposable
     {
         /// <summary>
         /// 鍖哄煙绫诲瀷锛圡/DB/I/Q/T/C锛�
diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs
index a564cbb..6ebd64c 100644
--- a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs
+++ b/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">鏄惁姝e湪閲婃斁鎵樼璧勬簮</param>
+        protected virtual void Dispose(bool disposing)
+        {
+            if (!_disposed)
+            {
+                if (disposing)
+                {
+                    _lock?.Dispose();
+                }
+                _disposed = true;
+            }
         }
     }
 }

--
Gitblit v1.9.3