1、声明新的List类CanDisposeList
/// <summary>/// 可释放子元素逻辑占用的List/// </summary>/// <typeparam name="T"></typeparam>public class CanDisposeList<T> : ObservableCollection<T>, IDisposable where T : IDisposable{/// <summary>/// 析构函数(Finalizer):作为兜底,防止开发者忘记调用 Dispose()/// </summary>~CanDisposeList(){// 仅释放非托管资源(托管资源可能已被 GC 回收,避免重复操作)this?.Dispose();}public void Dispose(){// 遍历释放所有元素 this?.ForEach(item => item.Dispose());foreach (var item in this){item?.Dispose();}base.Clear();GC.SuppressFinalize(this);}/// <summary>/// 重写 Clear()/// </summary>public new void Clear(){foreach (var item in this){item?.Dispose();}base.Clear();}/// <summary>/// 重写 RemoveAt()/// </summary>public new void RemoveAt(int index){if (index >= 0 && index < Count){this[index]?.Dispose();}base.RemoveAt(index);}/// <summary>/// 重写 Remove():/// </summary>public new bool Remove(T item){item?.Dispose();return base.Remove(item);}}
2、示例类 ClassA
public class ClassA : IDisposable{public int Int1 { get; set; } = 1;public List<string> List1 { get; set; } = new List<string>();public string Str1 { get; set; } = string.Empty;public ClassA(){Debug.WriteLine("New");}/// <summary>/// 析构函数(Finalizer):作为兜底,防止开发者忘记调用 Dispose()/// </summary>~ClassA(){// 仅释放非托管资源(托管资源可能已被 GC 回收,避免重复操作)Dispose();}public void Dispose(){Int1 = 0;Debug.WriteLine("Dispose 123");}}
3、测试代码
CanDisposeList<ClassA> class1s = new CanDisposeList<ClassA>();
class1s.Add(new ClassA() { Str1 = "1" });
class1s.Add(new ClassA() { Str1 = "2" });
class1s.Add(new ClassA() { Str1 = "3" });CanDisposeList<ClassA> class2s = new CanDisposeList<ClassA>();
class2s.Add(new ClassA());
class2s.Add(new ClassA());
class2s.Add(new ClassA());class1s.Clear(); // 赋值前手动释放
class1s = class2s; // 赋值