新手学C# ,内存释放 1、C#里面的析够函数是 ~classname吗? 那我怎么在里面释放我在构造函数里面new 的一大堆东西呢?2、创建了类对象了,又怎么释放该对象? 据说自动释放,可我得知道他什么时候自动释放吧? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 析够函数是 ~classname C#中已经不存在了.释放对象或内存,你不用考虑了. 1、C#确实没有析构函数,替代它的是句法与c++析构函数一致的Finalizer(终结方法)。你可以用~classname(){...}的形式实现终结方法,换句话说~classname(){...}只是与析构函数貌似。2、垃圾回收只在资源紧张的时候自动进行,你无法准确得知对象被销毁的时间,因为你不能精确地控制何时调用这个对象的Finalizer。遇到非托管资源这类必须显示控制清理的问题时,可以实现Dispose方法,当不需要某个对象时,显示调用对象的dispose()方法这是一个较复杂的问题,你需要进一步找资料查看,区区几句话也许会有误导的地方 顺便问一下,怎么在datagrid里面静态的加列和列头啊,找不到相关属性,现在绑定数据后,上面显示的是英文的字段名称? 选中该DataGrid-属性-属性生成器-列具体怎么添加你自己看下就知道了。 C#的析构函数是在对象被回收的时候处理的,非托管的资源才需要手工释放,比如OleDbConnection,OleDbCommand 1、C#里面的析够函数是 ~classname吗? 那我怎么在里面释放我在构造函数里面new 的一大堆东西呢?//对于托管资源,是由垃圾收集器自动回收,回收时间不定,回收先前条件是:内存耗尽(这个表示有误,你最高翻翻李建忠先生翻译的那本书《。net框架技术内幕》,会有更为详细的解释)2、创建了类对象了,又怎么释放该对象? 据说自动释放,可我得知道他什么时候自动释放吧?//同上 析构函数在C#里面没有了,你创建了对象可以不去释放对象,.NET提供的垃圾回收机制会做这样的事情。但是你也可以通过重写Dispose方法清理非托管资源。 所有的托管对象都会自动释放,不用写析构函数或者终结器。但是如果你的类中包含了非托管资源,那么就必须在析构函数或者说终结器中释放,并最好实现IDispose接口使得别人能手动释放。 To : wang2034(HOH)他說新手就新手?別人是C#新手,又不是編程新手。了解一個語言及框架就是内存搞起,你學C++不懂内存搞屁哦你。 呵呵,谢谢楼上帮我说话,就是啊,C++里面都是自己释放的啊,只是现在搞C#,要直接做东西,哪有太多时间来慢慢看那么多书呢,不过好在C++和VB都比较熟,所以上手感觉还可以, 再问下,什么叫托管对象?什么叫非托管对象,非托管对象释放是否就是dispose啊? 对了,C#里面有没有对象集啊,类似Delphi里面的ObjectList,我将数据库里面的每条记录都作为一个对象,要放在一个集里面啊!! 谢谢!! 呵呵,谢谢楼上帮我说话,就是啊,C++里面都是自己释放的啊,只是现在搞C#,要直接做东西,哪有太多时间来慢慢看那么多书呢,不过好在C++和VB都比较熟,所以上手感觉还可以, 再问下,什么叫托管对象?什么叫非托管对象,非托管对象释放是否就是dispose啊?非托管资源基本上用不到,你只要知道如果你的类里面内嵌了实现了IDispose接口的对象,你就应该要实现IDispose接口让外面能手动调用里面的Dispose方法。例如:class FileAcccesser{ FileStream _filestream; public FileAccesser() { _filestream = new FileStream(... ); }}像这种情况就要实现IDispose,即你自己创建了一个实现了IDispose的对象实例嵌在里面。2、C#里面有数组,不定长数组可以用System.Collections.ArrayList。 to Ivony() :谢谢回答,对第二个问题,你的意思是说没有对象容器是吧,了解。 对第一个问题,你说: 像这种情况就要实现IDispose,即你自己创建了一个实现了IDispose的对象实例嵌在里面。是否就是说我自己要在析够函数或者说我自己写的表示结束的函数里 要写 _filestream.dispose 是不是这个意思? http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfsystemgcclasstopic.asp to Ivony() :谢谢回答,对第二个问题,你的意思是说没有对象容器是吧,了解。我不知道ObjectCollection是什么,不过.NET里面有很多的容器,都在System.Collection这个命名空间的下面。 对第一个问题,你说: 像这种情况就要实现IDispose,即你自己创建了一个实现了IDispose的对象实例嵌在里面。是否就是说我自己要在析够函数或者说我自己写的表示结束的函数里 要写 _filestream.dispose 是不是这个意思?对,但不要在析构函数中写。首先,你自己创建了一个需要释放非托管资源的对象,所以,你有责任把它销毁。只有非托管资源是需要我们自己来关注销毁的。而你自己创建一个包含非托管资源的对象,也就是你间接的拥有了非托管资源,所以你有责任完成这个。那么你的类也是给别人用的,你并不是在一个方法中使用这个非托管资源,并在离开时立即销毁,而是这个非托管资源要在你的类的生存期内一直可用。那么这种情况下你就有必要实现IDispose接口,让使用你的类的程序,能够手动的释放掉你间接拥有的非托管资源。如果你不是直接拥有非托管资源,就不要在析构函数中释放,因为如上例,根据GC的原理,当你的类要被调用析构函数的时候,你的类所拥有的_filestream可能早就已经被GC回收了。这个时候引用_filestream就可能出问题。 DataGridview 怎么把自定义控件添加的列表中 C#访问带密码的网络路径 求{堆和栈}的区别??????????? 我利用tcp实现了文件传输,但想用udp判断对方是否在线,不知如何实现 C#分层的问题? 关于用vs2005编写c# winform程序时;对*.Designer.cs文件中几行初始代码的理解? 怎么删除dataGrid的数据 更新文件和注册表,支持回滚 总店与门店通信问题 关于一个vs2005的编译的问题.找了很多资料不知道怎么解决.请高人指点 手动添加combobox的选项时,如何设定某一选项的value值? 关于Panel控件的问题,高手请进
释放对象或内存,你不用考虑了.
C#确实没有析构函数,替代它的是句法与c++析构函数一致的Finalizer(终结方法)。
你可以用~classname(){...}的形式实现终结方法,换句话说~classname(){...}只是与析构函数貌似。
2、
垃圾回收只在资源紧张的时候自动进行,你无法准确得知对象被销毁的时间,因为你不能精确地控制何时调用这个对象的Finalizer。
遇到非托管资源这类必须显示控制清理的问题时,可以实现Dispose方法,当不需要某个对象时,显示调用对象的dispose()方法这是一个较复杂的问题,你需要进一步找资料查看,区区几句话也许会有误导的地方
具体怎么添加你自己看下就知道了。
C#里面的析够函数是 ~classname吗? 那我怎么在里面释放我在构造函数里面new 的一大堆东西呢?
//对于托管资源,是由垃圾收集器自动回收,回收时间不定,回收先前条件是:内存耗尽(这个表示有误,你最高翻翻李建忠先生翻译的那本书《。net框架技术内幕》,会有更为详细的解释)
2、
创建了类对象了,又怎么释放该对象? 据说自动释放,可我得知道他什么时候自动释放吧?
//同上
他說新手就新手?別人是C#新手,又不是編程新手。了解一個語言及框架就是内存搞起,你學C++不懂内存搞屁哦你。
{
FileStream _filestream;
public FileAccesser()
{
_filestream = new FileStream(... );
}
}
像这种情况就要实现IDispose,即你自己创建了一个实现了IDispose的对象实例嵌在里面。2、C#里面有数组,不定长数组可以用System.Collections.ArrayList。
谢谢回答,对第二个问题,你的意思是说没有对象容器是吧,了解。
对第一个问题,你说:
像这种情况就要实现IDispose,即你自己创建了一个实现了IDispose的对象实例嵌在里面。
是否就是说我自己要在析够函数或者说我自己写的表示结束的函数里 要写 _filestream.dispose 是不是这个意思?
谢谢回答,对第二个问题,你的意思是说没有对象容器是吧,了解。我不知道ObjectCollection是什么,不过.NET里面有很多的容器,都在System.Collection这个命名空间的下面。
对第一个问题,你说:
像这种情况就要实现IDispose,即你自己创建了一个实现了IDispose的对象实例嵌在里面。
是否就是说我自己要在析够函数或者说我自己写的表示结束的函数里 要写 _filestream.dispose 是不是这个意思?对,但不要在析构函数中写。首先,你自己创建了一个需要释放非托管资源的对象,所以,你有责任把它销毁。只有非托管资源是需要我们自己来关注销毁的。而你自己创建一个包含非托管资源的对象,也就是你间接的拥有了非托管资源,所以你有责任完成这个。那么你的类也是给别人用的,你并不是在一个方法中使用这个非托管资源,并在离开时立即销毁,而是这个非托管资源要在你的类的生存期内一直可用。那么这种情况下你就有必要实现IDispose接口,让使用你的类的程序,能够手动的释放掉你间接拥有的非托管资源。如果你不是直接拥有非托管资源,就不要在析构函数中释放,因为如上例,根据GC的原理,当你的类要被调用析构函数的时候,你的类所拥有的_filestream可能早就已经被GC回收了。这个时候引用_filestream就可能出问题。