- 积分
- 12570
- 明经币
- 个
- 注册时间
- 2015-8-18
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 你有种再说一遍 于 2025-2-6 02:43 编辑
# 在线运行
发现了一个网站,可以去在线运行
可以分享自己的测试代码,
它还可以查看MSIL,例如想知道foreach或者await/async原理
就可以点入IL而不是Run.
嘿嘿
不过超时代码会返回超时.
其实很久之前我都是用AI写代码的了,
因为只需要思路正确基本上AI能自动跑出来.
可能是C#代码很多的原因,连AI都知道怎么写,
某些人居然说C#案例少...微软亲儿子怎么会少呢?
https://sharplab.io
# 布局+WorkingDatabase到底是什么
发现之前写错了布局的获取方式:
https://www.cnblogs.com/JJBox/p/18697838
可能也有不少人跟我一样是遍历块表,
现在更正一下.
明明DBDictionary也是字典,为什么需要转为Dictionary呢?
因为我要保证所有的tr.GetObject前面要加using.这是原则.
那么为什么需要using呢?
因为它是数据库资源,而我们用了数据库就要释放掉它.
而缓存的key最好是字符串,或者ObjectId,
否则就会强引用数据库对象,造成只有缓存释放后,才能跟踪释放对象...
有些例如面域对象,它甚至会给你抛出:遗忘释放对象.
有没有存在例外?
答案是不存在例外.
我处理过一个比较有技巧性的地方就是
如果有ent.IsNewObject新旧都要处理的话,
请把新旧ent后面的操作的函数们全部封装为一个函数,
这样旧ent就可以using了.
它在这里:巧妙的处理释放
https://www.cnblogs.com/JJBox/p/12433735.html
如果不加using,
Rider或者VS会推荐你把foreach改为LINQ,
它是错误推荐,
它是错误推荐,
它是错误推荐,
(重要事情说三遍)
因为它觉得你的对象可以自动释放,
但是其实不行,因为LINQ的select可能是过程的,
例如:
var ent = ids.Select(id => (Entity)tr.GetObject(id))
.FirstOrDefault(ent => ent.ColorIndex == 1);
这种操作就会令前面几个ent打开之后暂存在非托管堆中,
因为cad有长生命周期的图元,然后遗忘释放了.
我也不知道为什么桌子要这样干呢.
箭头哥在我的逼迫下把全部tr.GetObject都加using了,哈哈 |
|