当前位置: 首页 > 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.zskr.cn/news/47950.html

相关文章:

  • 值得复习的题目
  • 找唯一特征去重转移DP——CF1210F2 Marek and Matching
  • 固体废物资源化处理简答题与论述题
  • 详细介绍:Python基础语法与数据类型详解
  • 第23天(简单题中等题 二分查找)
  • Cinema4D 2025保姆级下载安装教程|含安装包获取+新手入门指南
  • CF2101D
  • 01321:棋盘问题
  • C 变量的作用域与生存周期
  • #题解#洛谷P1496#离散化#
  • 20251112 正睿
  • 如何根据色带计算电阻阻值
  • 《云操作系统(OpenStack)第二版》学习笔记汇总版-从0开始完成在线安装并为离线安装准备软件包
  • Day36(6)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project01
  • 2025 11 12
  • Total Recall: 如何在Windows下开发输入法
  • 大数据量场景下的编辑 / 选择 / 详情优化
  • RabbitMQ相关
  • 使用NVIDIA TAO 6和DeepStream 8构建实时视觉检测管道 - 实践
  • ChatBI 重构工业数据交互:TDengine IDMP 让数据对话更智能
  • 云服务模式进化论:企业云战略的致命误区,从IaaS到FaaS的死亡之旅!
  • Python 实现对遥感影像根据DN值上色
  • 【免费】MySQL自动化运维工具,一键生成WORD和EXCEL
  • 实用指南:轻量化 + 绿色部署的日志监控系统log-monitor设计思路(一)
  • 随机链表的复制-leetcode
  • useActionState 阻止表单重置
  • 部署MQTT Broker - Mosquitto - -YADA
  • 7年java开发的一些感悟
  • 11.12 NOIP模拟6/多校1 改题记录
  • FFmpeg for Android 图传Web