C# 实例销毁问题

塔克茜丝 2021-04-23 10:44:19
小白问题:

我在form1定义了一个全局类型 变量
public class A {}
public A b;

然后在程序里几次用到

b=new A();->装载一个a文件


后面又一次

b=new A();->装载一个b文件

到这一次的时候,上面的那个A实例是被系统自动回收了么?望指教
...全文
1192 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiangqing 2021-04-27
  • 打赏
  • 举报
回复
到这一次的时候,上面的那个A实例是被系统自动回收了么-->是的
heyingss 2021-04-26
  • 打赏
  • 举报
回复
引用 10 楼 Six-Classics-note-Me 的回复:
首先不建议你频繁的new,你只需要保证你用的时候,你从对象是正确的就可以了。 不行就public 一个变量,在开始的时候new一下,后面一致用就可以了。还不用考虑你频繁new的时候,你第一次的new实例是否被改变了,这样多好。 好像我说的跑题了。 非要证明这个,虽好的方法是测试。。看结果。
同意这个说法。
塔克茜丝 2021-04-25
  • 打赏
  • 举报
回复
多谢各位回复,受教
six2me 2021-04-25
  • 打赏
  • 举报
回复
首先不建议你频繁的new,你只需要保证你用的时候,你从对象是正确的就可以了。 不行就public 一个变量,在开始的时候new一下,后面一致用就可以了。还不用考虑你频繁new的时候,你第一次的new实例是否被改变了,这样多好。 好像我说的跑题了。 非要证明这个,虽好的方法是测试。。看结果。
xuzuning 2021-04-25
  • 打赏
  • 举报
回复
两次 b=new A(); 你只能使用一个 A 实例, 觉得浪费l了就别这么写,回不回收跟你没关系,反正你也看不见
正怒月神 2021-04-25
  • 打赏
  • 举报
回复
只要你后面没有一直在引用,就会释放。 但具体释放时间,是不能确定的。这个由gc决定。
  • 打赏
  • 举报
回复
类似的问题,当你的对象使用到底层的资源句柄,你就要了解一下此对象是否需要及时释放。最好用测试验证,理论都不重要,要以测试为准。 如果需要释放,那么通常要写到
using(var ........)
{
......
}
结构中,能保证及时调用组件的释放代码。
  • 打赏
  • 举报
回复
对于 Release版本,通常在你第二次给 b 变量赋值几秒钟之内,第一个实例对象就被 GC 处理过了。但是Debug 环境下经常(例如调试器可能关联到了)而延迟到所在的方法被调用完毕之后才被 GC 处理。 一般来说,不用操心这类问题。.net 系统会自动频繁调用GC来清理垃圾对象。仅当某些特殊情况下才需要注意这类问题,例如当你通过 System.Data.Common 来创建大量数据库逻辑连接,连接对象是自动共享使用底层数据库连接池的,因此在不需要逻辑链接时尽早地“释放回收”连接对象,能防止(几秒钟内有太多的逻辑连接请求时)底层连接池资源耗尽。
wanghui0380 2021-04-23
  • 打赏
  • 举报
回复
引用
没有被引用的对象
所以我不回答到底会不会销毁。这个需要你自己回答,到底你还有没有其他地方占用他,没有占用Gc会择机释放,有占用gc哪敢乱释放
老夏 2021-04-23
  • 打赏
  • 举报
回复
没有被引用的对象,系统会回收,但是什么时候回收不能保证,再次 b = new A() 的时候,b原来引用的对象就不再被引用了
  • 打赏
  • 举报
回复
引用 2 楼 塔克茜丝 的回复:
具体是这样,我有一个list<A>在dgv,T是中存储了一个不同路径的文件 我定义了一个publc A CurrentObject, 选中List 第3行,我用CurrentObject=new A();来执行不同的操作。 那我点选5行时,还想用CurrentObject=new A();就是第二个了。 那么上一次3行的new A()对象会被销毁么? 我点选回3行,会再重新生成一次。
应该是会的,因为没有引用了,但是什么时候回收,由系统自己判断。
塔克茜丝 2021-04-23
  • 打赏
  • 举报
回复
具体是这样,我有一个list<A>在dgv,T是中存储了一个不同路径的文件 我定义了一个publc A CurrentObject, 选中List 第3行,我用CurrentObject=new A();来执行不同的操作。 那我点选5行时,还想用CurrentObject=new A();就是第二个了。 那么上一次3行的new A()对象会被销毁么? 我点选回3行,会再重新生成一次。
The 祺℡ 2021-04-23
  • 打赏
  • 举报
回复
回收是對object的操作,不是對class的操作。b=new A(); 執行2次,b對象不是還在麽, 回收誰?

儅b=null的時候,b才會被回收,而且C#有自己的回收機制,雖然可以手動System.GC.Collect();用不好反而會讓程序運行變得更慢而已。

111,088

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧