要的就是你这个答案,既然懂的话就给解释下吧。 dispose释放了非托管资源?那我问两个问题 一.如上代码,为什么Dispose后大部分方法和属性都可以正常使用,Show确会异常; 二.Form2 f = null; using (f = new Form2()) { } string s = f.Text;//这跟上面代码不太一样,new后直接释放了,没有show,但是这里的f.Text却会报异常,这又是为什么呢?以上两问,望jointan不吝赐教,3Q
void MM() { Form2 f = null; using (f = new Form2()) {
} string s = f.SS; }重贴下代码
using 是对应IDisposable接口的.对象的IDisposable接口,主要是释放资源,而不是释放内存,.Net中,对于存在引用的任何东西,都不会释放内存,这在自己的代码中没法控制.Show方法,是操纵资源的,Dispose也就释放是Handle和组件模型中的Container中的成员(Dispose会和Close互相调用),所以,如果某属性或方法,需要使用这两个中的内容时,会异常,但其他的成员变量,由于不属于Dispose方法释放的范围(实际上也没法释放,.Net根本没有这个功能),所以肯定还是能访问的.由于.Net的引用是依靠跟踪(计数,差不多也就是addref等原始方法)实现的,只要你可以测试(也就是你可以用代码访问),那么,你访问的变量,可能就是它的最后一个引用,由于存在这个引用,所以引用计数不可能为0,即使GC.Collect也没用,依然不会清理这块内存,也有不会有任何异常返回,而且值也是你原先设定的,所以,你没法测试对象销毁后,访问他会出现什么问题.事实上,用C说,在free后,只要在原内存上没发生malloc,这块内存也是可以正常访问的,只不过访问已经没有意义了,但不确定未来时间会重写这段内存,C中也不是free后,立即执行类似memset之类的函数.
dispose释放了非托管资源?那我问两个问题
一.如上代码,为什么Dispose后大部分方法和属性都可以正常使用,Show确会异常;
二.Form2 f = null; using (f = new Form2()) { } string s = f.Text;//这跟上面代码不太一样,new后直接释放了,没有show,但是这里的f.Text却会报异常,这又是为什么呢?以上两问,望jointan不吝赐教,3Q
void MM() {
Form2 f = null;
using (f = new Form2()) {
}
string s = f.SS;
}重贴下代码