当前位置: 首页 > news >正文

List执行Dispose时可释放子元素逻辑占用的List写法

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;  // 赋值

 

http://www.jsqmd.com/news/38860/

相关文章:

  • Sora 后思考:从 AI 工具到 AI 平台,产业 AGI 又近了一步 - 指南
  • Scapy构建telnet包
  • Spring AI Alibaba 项目源码学习(三)-Graph 执行流程分析
  • 值得复习的题目
  • 逻辑回归原理与案例分析
  • 找唯一特征去重转移DP——CF1210F2 Marek and Matching
  • UEFI Boot Manager
  • 25年11月计数题做题记录
  • 固体废物资源化处理简答题与论述题
  • noip6 多校1
  • CCPC2025哈尔滨站-H. 匹配
  • 通过开发环境部署工具安装qt相关c++开发环境
  • 第23天(简单题中等题 二分查找)
  • Cinema4D 2025保姆级下载安装教程|含安装包获取+新手入门指南
  • 2014 吉林省赛题解 | CCUT应用OJ题解——F[X] + X = N
  • 洛谷 P4859 已经没有什么好害怕的了 题解(DP,二项式反演)
  • 01321:棋盘问题
  • C 变量的作用域与生存周期
  • 模式识别与机器学习课程笔记(11):深度学习 - 详解
  • 05.创建型 - 简单工厂模式(Simple Factory Pattern)
  • RabbitMQ延迟队列rabbitmq_delayed_message_exchange
  • HaluMem:揭示当前AI记忆系统的系统性缺陷,系统失效率超50%
  • 团队作业2-需求规格说明书
  • Mac安装Visual Studio 2019.dmg详细步骤(附图解,小白也能懂,附安装包)
  • 20251112 正睿
  • 如何根据色带计算电阻阻值
  • 25.11.12 差分约束算法
  • 11/12
  • Linux C/C++ 学习日记(27):KCP协议(三):源码分析与使用示例 - 实践
  • 解决Cursor编辑器无法通过include path识别C++头文件的问题