- 积分
- 11680
- 明经币
- 个
- 注册时间
- 2015-8-18
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 你有种再说一遍 于 2024-12-17 03:50 编辑
上一篇我们学习了链式调用Linq并行操作,
其实链式调用其实很容易引起内存泄露.
现代编程除了链式编程,还有智能指针,在c#就是using来操控.
good:
using var reg = regedit.CreateSubKey("AcDim");
var n = reg.GetNames();
using var reg2 = regedit.CreateSubKey("AcDim2");
n = reg2.GetNames();
bad:
var n = regedit.CreateSubKey("AcDim").GetNames();
bad:
using var reg = regedit.CreateSubKey("AcDim");
var n = reg.GetNames();
reg = regedit.CreateSubKey("AcDim2");
n = reg.GetNames();
CAD上面Linq打开图元,
方案三就是一个错误案例,
方案四就是有名函数注意了释放顺序.
https://www.cnblogs.com/JJBox/p/16002267.html#_label3_0_0_0
bad:
.Select(btrId => (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead)) // 这里无法using对象
即使串行遍历,那么所有的tr.GetObject都需要using的!!
用新语法using,并且每个tr.GetObject前面都要,
using的对象如果是加入数据库,cad会自动处理的,不会被释放,原理cad会用ent.IsNewObject指针来决定释放.
using的对象如果是临时的,那么就会被释放.
这就是智能指针.
不要问为什么,因为出错就知道为什么了...
相关错误的记录在这里:
https://www.cnblogs.com/JJBox/p/12371467.html
为此我还把整个博客上面的内容加了using.
当然了,如果你用的是IFox,那么事务栈的GetObject已经被设计过了.
此处记录了一个经典案例,尝试把using对象的权限偷出去
https://www.cnblogs.com/JJBox/p/12433735.html
不知道为什么VS没有进行强行提示,
但凡实现过IDisposable接口的对象给你来个波浪线就好啦.
不过这好像也不会惠及CAD,
因为CAD实现的不是这个接口...
CAD的类用的是DisposableWrapper接口,
不是IDisposable接口,造成没有自动引用析构.
我才知道原来还有车规级代码,
百分百测试覆盖...
但凡设计机器的,连动态加载都不允许,动态数组也不允许,
还得用静态链表,因为存在电子反转,还得纠错码...
细枝末节:
无序找值居然能提速:
https://blog.csdn.net/Xiaowu_First/article/details/88946222
分支预测居然提速6倍:
https://www.cnblogs.com/xindoo/p/13192669.html |
|