想请教一个关于GC的问题

时间:2023-01-19 16:58:11
如果一个用托管代码写的类包含非托管的字段,那么它会不会被GC回收?是必须实现IDisposable接口,还是只需要在构析函数里面调用Disposable就够了?谢谢各位大神

8 个解决方案

#1


如果一个用托管代码写的类包含非托管的字段,那么它会不会被GC回收?是必须实现IDisposable接口,还是只需要在构析函数里面调用Disposable就够了?谢谢各位大神 
=========================================
不会被回收,不是必须实现IDisposable,
IDisposeable接口只是给你能够及时释放的他机会。
所以不是只要调用Disposeable,就可以,比如你可以写一个CLOSE函数,想要结束他的时候CLOSE

#2


引用 1 楼 hdt 的回复:
如果一个用托管代码写的类包含非托管的字段,那么它会不会被GC回收?是必须实现IDisposable接口,还是只需要在构析函数里面调用Disposable就够了?谢谢各位大神 
=========================================
不会被回收,不是必须实现IDisposable,
IDisposeable接口只是给你能够及时释放的他机会。
所以不是只要调用Disposeable,就可以,比如你可以写一个CLOSE函数,想要结束他的时候CLOSE

再请教下,这个Close方法应该写些什么?C#似乎无法手动释放非托管资源

#3


引用 2 楼 q199308040000 的回复:
Quote: 引用 1 楼 hdt 的回复:

如果一个用托管代码写的类包含非托管的字段,那么它会不会被GC回收?是必须实现IDisposable接口,还是只需要在构析函数里面调用Disposable就够了?谢谢各位大神 
=========================================
不会被回收,不是必须实现IDisposable,
IDisposeable接口只是给你能够及时释放的他机会。
所以不是只要调用Disposeable,就可以,比如你可以写一个CLOSE函数,想要结束他的时候CLOSE

再请教下,这个Close方法应该写些什么?C#似乎无法手动释放非托管资源

对,你可以反编译一下ado.net socket,io 下面的类看看

#4


不用显示调用吧,系统会自己清理。当前提前释放的好处是,马上得到释放的资源

#5


引用 3 楼 hdt 的回复:
Quote: 引用 2 楼 q199308040000 的回复:

Quote: 引用 1 楼 hdt 的回复:

如果一个用托管代码写的类包含非托管的字段,那么它会不会被GC回收?是必须实现IDisposable接口,还是只需要在构析函数里面调用Disposable就够了?谢谢各位大神 
=========================================
不会被回收,不是必须实现IDisposable,
IDisposeable接口只是给你能够及时释放的他机会。
所以不是只要调用Disposeable,就可以,比如你可以写一个CLOSE函数,想要结束他的时候CLOSE

再请教下,这个Close方法应该写些什么?C#似乎无法手动释放非托管资源

对,你可以反编译一下ado.net socket,io 下面的类看看

前面因为没看仔细。回复有些问题。c# 可以释放非托管资源,因为.net 可以调用平台本身提供的服务。请搜索msdn 关于 平台调用部分。

#6


GC回收的是CLR管理的托管代码,非托管的回收不了,IDisposable接口提供了一种释放非托管资源的方式。网上关于释放资源的文章很多的,
http://www.360doc.com/content/13/0106/18/6295074_258608963.shtml

#7


非托管对象不会被 GC 回收。

实现 IDisposable 不是必需的,不过要使用 using 语法,就必须要实现 IDisposable

在析构函数里面释放资源,是一种行之有效的写法,.net framework 类库就有这样的做法,不过因为析构函数被调用的时间不定,所以这种写法不是万能的,也会造成内存占用过多。

#8


非托管的,就要手动释放。
析构函数和GC的机制,那就不是我们控制的了。

#1


如果一个用托管代码写的类包含非托管的字段,那么它会不会被GC回收?是必须实现IDisposable接口,还是只需要在构析函数里面调用Disposable就够了?谢谢各位大神 
=========================================
不会被回收,不是必须实现IDisposable,
IDisposeable接口只是给你能够及时释放的他机会。
所以不是只要调用Disposeable,就可以,比如你可以写一个CLOSE函数,想要结束他的时候CLOSE

#2


引用 1 楼 hdt 的回复:
如果一个用托管代码写的类包含非托管的字段,那么它会不会被GC回收?是必须实现IDisposable接口,还是只需要在构析函数里面调用Disposable就够了?谢谢各位大神 
=========================================
不会被回收,不是必须实现IDisposable,
IDisposeable接口只是给你能够及时释放的他机会。
所以不是只要调用Disposeable,就可以,比如你可以写一个CLOSE函数,想要结束他的时候CLOSE

再请教下,这个Close方法应该写些什么?C#似乎无法手动释放非托管资源

#3


引用 2 楼 q199308040000 的回复:
Quote: 引用 1 楼 hdt 的回复:

如果一个用托管代码写的类包含非托管的字段,那么它会不会被GC回收?是必须实现IDisposable接口,还是只需要在构析函数里面调用Disposable就够了?谢谢各位大神 
=========================================
不会被回收,不是必须实现IDisposable,
IDisposeable接口只是给你能够及时释放的他机会。
所以不是只要调用Disposeable,就可以,比如你可以写一个CLOSE函数,想要结束他的时候CLOSE

再请教下,这个Close方法应该写些什么?C#似乎无法手动释放非托管资源

对,你可以反编译一下ado.net socket,io 下面的类看看

#4


不用显示调用吧,系统会自己清理。当前提前释放的好处是,马上得到释放的资源

#5


引用 3 楼 hdt 的回复:
Quote: 引用 2 楼 q199308040000 的回复:

Quote: 引用 1 楼 hdt 的回复:

如果一个用托管代码写的类包含非托管的字段,那么它会不会被GC回收?是必须实现IDisposable接口,还是只需要在构析函数里面调用Disposable就够了?谢谢各位大神 
=========================================
不会被回收,不是必须实现IDisposable,
IDisposeable接口只是给你能够及时释放的他机会。
所以不是只要调用Disposeable,就可以,比如你可以写一个CLOSE函数,想要结束他的时候CLOSE

再请教下,这个Close方法应该写些什么?C#似乎无法手动释放非托管资源

对,你可以反编译一下ado.net socket,io 下面的类看看

前面因为没看仔细。回复有些问题。c# 可以释放非托管资源,因为.net 可以调用平台本身提供的服务。请搜索msdn 关于 平台调用部分。

#6


GC回收的是CLR管理的托管代码,非托管的回收不了,IDisposable接口提供了一种释放非托管资源的方式。网上关于释放资源的文章很多的,
http://www.360doc.com/content/13/0106/18/6295074_258608963.shtml

#7


非托管对象不会被 GC 回收。

实现 IDisposable 不是必需的,不过要使用 using 语法,就必须要实现 IDisposable

在析构函数里面释放资源,是一种行之有效的写法,.net framework 类库就有这样的做法,不过因为析构函数被调用的时间不定,所以这种写法不是万能的,也会造成内存占用过多。

#8


非托管的,就要手动释放。
析构函数和GC的机制,那就不是我们控制的了。