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.mzph.cn/news/963835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sora 后思考:从 AI 工具到 AI 平台,产业 AGI 又近了一步 - 指南

Sora 后思考:从 AI 工具到 AI 平台,产业 AGI 又近了一步 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

Scapy构建telnet包

Scapy构建telnet包文件代码 老师的 from scapy.all import *#我发第一次握手SYN ws1=IP(dst="172.16.100.101")/TCP(sport=10000,dport=23,flags=S,seq=1000)#对方发第二次握手 SA 包 ws2=sr1(ws1)#我发第三…

Spring AI Alibaba 项目源码学习(三)-Graph 执行流程分析

Graph 执行流程分析 概述 本文档分析 spring-ai-alibaba-graph-core 模块中 Graph 的执行流程,包括执行器(Executor)、调度机制、Checkpoint 机制和状态管理。 入口类说明 GraphRunner - 执行入口 GraphRunner 是基…

逻辑回归原理与案例分析

一、逻辑回归基本概念 逻辑回归:用于解决二分类问题的统计学习方法,虽然名字中有"回归",但实际上解决的是分类问题。 核心思想:根据给定的输入特征,通过逻辑函数(Sigmoid函数)计算出样本属于某个特定…

杂题记录 4

NOIP 前咋还布置一堆数据结构 /yun,关键布置的有八成都是做过的。于是乱找了些 DS 做。 P14363 [CSP-S 2025] 谐音替换 / replace 发现是询问 \(p\in P,q\in Q\) 的 \((p,q)\) 的个数的形式,其中 \(p\in P\) 指的是 …

找唯一特征去重转移DP——CF1210F2 Marek and Matching

找唯一特征值去重转移DP——CF1210F2 Marek and Matching 匹配肯定利用霍尔定理,先写出:\(\forall S,|S|-|G(S)|\le 0\)。 图论计数往往考虑容斥,设 \(f_{S,T}\) 表示对于二分图 \((S,T)\),出现大小为 \(|S|\) 的匹…

UEFI Boot Manager

简介 UEFI boot manager是一个固件方针引擎,它可以通过修改global NVRAM 变量来配置;它会按照global NVRAM variable 定义的顺序来加载UEFI driver or UEFI application。当固件初始化完成,就会把控制权交给boot ma…

25年11月计数题做题记录

AGC073C 因为实数不好处理所以我们考虑将实数映射到整数上去做,相当于我们把值域在 \([-(n-1),1]\) 之间的实数映射到 \([-(n-1)m,m]\) 之间的整数上,其中 \(m\rightarrow\infty\),现在我们需要考虑的就是值域在 \(…

固体废物资源化处理简答题与论述题

固体废物处理核心内容简答题与论述题(含解说) 一、简答题(侧重基础概念与关键参数) 1. 简答题1:固体废物分类及“三化”“3R”原则分别是什么?答案:分类:工业固体废物、城市固体废物、农业固体废物、危险废物、…

详细介绍:Python基础语法与数据类型详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

noip6 多校1

11.1211.12 t1 \(O(nm^2)\)是简单的。 发挥人类智慧发现每次最优只在前面较少的状态。 于是可过。 其实人类智慧有证明的。 考虑若最大值越大,则选的次数越小,反之亦然。 平均一下就过了。 codet1 #include <bits…

CCPC2025哈尔滨站-H. 匹配

时停问题,考虑势能函数。设单个集合的势能函数为 \(f(x)\),其中 \(x\) 为集合大小,这是合法的。总的势能 \(\Phi = \sum\limits_{s\in S} f(|s|)\).考虑列出方程解出 \(f\)。 满足鞅的时停定理的势能 \(\Phi\) 满足…

通过开发环境部署工具安装qt相关c++开发环境

通过开发环境部署工具安装qt相关c++开发环境

第23天(简单题中等题 二分查找)

打卡第二十三天 1道简单题+2道中等题题目: 两数之和思路一: 双指针,题目说数组下标从1开始,先初始指针还是从0开始,返回时左右指针都加1就行 代码: class Solution { public:vector<int> twoSum(vector<int&g…

Cinema4D 2025保姆级下载安装教程|含安装包获取+新手入门指南

目录一、Cinema4D 2025 核心功能亮点二、Cinema4D 2025 正规下载渠道1.Cinema4D 2025 下载(推荐)2.其他下载注意事项三、Cinema4D 2025 详细安装激活步骤(Windows 系统)步骤 1:解压安装包(提前关闭杀毒软件)步骤…

CF2101D

给定一个长度为 \(n\) 的排列 \(a\),问其有多少个子串 \(b\),使得 \(LIS(b) + LDS(b) = |b| + 1\) \(n \le 2 \times 10^5\)考虑一下题目给的条件在说啥,其实就是每个元素都在 \(LIS/LDS\) 中,只有一个相交的地方(…

【做题记录】HZOJ 多校-数论

B. [POI2011] SEJ-Strongbox 2025noip模拟赛73 BCode #include<bits/stdc++.h> #define int long long #define il inline #define pb push_back using namespace std; namespace asbt{ const int maxn=2.5e5+5;…

2014 吉林省赛题解 | CCUT应用OJ题解——F[X] + X = N

题目简介题意:对于任意十进制整数 \(X\),定义 \(F[X]^\dagger\) 表示其循环左移一位所得到的数。给定非负整数 \(N\),求所有满足等式 \(X+F[X]=N\) 的 \(X\) 的个数。 \(\dagger\) 循环左移:设 \(X=a_0a_1\cdots a…

洛谷 P4859 已经没有什么好害怕的了 题解(DP,二项式反演)

给两个长为 \(n\) 的数组 \(a, b,\) 求将 \(a_i, b_j\) 两两匹配使得 \(a_i > b_j\) 的数量比 \(a_i < b_j\) 的数量多 \(k\)。数字不重复, \(k \le n \le 2000\)。注意到,其实 \(a_i>b_j\) 和 \(a_i<b_j…