关于C#垃圾回收的困惑~~~~

2024-12-21 06:42:26
推荐回答(5个)
回答1:

一般来说系统的垃圾回收机制就足够用了,但是某些特殊的时候系统的垃圾回收会出现一些错误,比如一个对象已经出了生存周期但是没有被释放(这种情况一般是程序出错或者你自己发现内存泄漏的时候就会发现),这个时候你就需要使用GC.Collect()进行强制的垃圾回收。至于具体是什么对象造成的内存泄漏就需要你具体问题具体分析了。
------------------------------------------------------------------------------------------
好的习惯:
对于程序员来说,遵守良好的代码规范是最重要的,代码维护和服用对于一个企业来说是非常重要的,所以,遵守良好的代码规范为提高代码的可读性和可维护性提供了良好的基础。个人认为这是最重要的一点。
如果你能注意到垃圾回收的问题,那么对于内存的分配想必我不用多说,尽可能少的分配内存,充分理解值类型和引用类型在C#中使用上的区别对这一点非常有用;调用WindowsAPI要比较谨慎,尽量不写非安全(unsafe)的代码;
我想以上的这些如果你都能做好就已经算还可以了,其他的东西由于各个企业的企业文化不同,毕竟还是存在不小差别的

回答2:

嗯...C#是托管的.现在的面向对向语言都是这样.
根本做不到主动释放资源.
虽然有Dispose()方法...但是我查过..这种方法也是"建议"虚拟机去释放资源..只是种建议..不是绝对的命令...
这种在处理的队列里,属于低级别命令..如果系统资源占用较高,可能就会滞后.
不过还是有写的必要的.
一般,把比较占用资源的东西.写个作用域.
using(要释放的资源)
{
...
}
比如:
using(SqlConnection con = new SqlConnection())
{
...
}

那么..这个SqlConnection 只会在扩号内使用...使用完就会被释放...这种方法,也是个建议..不是绝对释放..

回答3:

.net和JAVA的垃圾回收差不多,都是自动回收的,Dispose()并不能保证将该内存模块清理掉,只是在栈中将该引用断开了。这样堆中的对应数据就失去联系了。同时,自动的对象计数器会统计到该堆数据失去引用,在.net的某一轮垃圾回收中就可能将其堆数据清理掉了。而(GC)垃圾回收器是不受外部控制的它只在自己需要的时候处理···
.NET程序员一般的编程习惯各式各样了,比如有人说匈牙利命名很伟大要遵守,但又有人说没必要(若是定义一个strName,然后多处使用后,突然要变成intName,就要有很多处的修改,但是一开始就定义成_Name就不会有这种情况,其实开发中最不必注意的就是.net程序员了,微软.net是出了名的耗内存,作为其环境下的程序员当然也有类似习惯。)
但是有必要的话还是编码严谨,注释详细,思路清晰,模块化,注意代码效率,不出现复用代码···
好了就这么多吧,其他的还是得自己体验了,别人的好习惯不见得是自己的好习惯,适合自己的才是好的

回答4:

个人建议你还是自己释放内存资源,因为垃圾回收器要电脑自己去判断……做为一个程序员,个人推荐养成良好的习惯,要自己去释放内存资源

回答5:

调用Dispose()不是释放对象的内存资源!
调用Dispose()实际上是告诉GC这个对象可以回收了
实际GC回收还有一系列的操作的,这都是.net内部封装的了
ps: GC = 垃圾回收器

编程的好习惯就是要做要规范!如变量命名到程序的流程要清晰

做C#的不用过多在意内存的释放~
以后你实践多了自会明白其中道理,经验才是最重要的