读书人

c# 关于析构函数,该怎么解决

发布时间: 2012-01-31 21:28:41 作者: rapoo

c# 关于析构函数
class test
{
~c()
{
Console.WriteLine( "已执行析构函数 ");
}
}


class Program
{
static void Main(string[] args)
{
while (true)
{
test a = new c();
}
}
}


--------------------

析构函数不能被程序员调用,那写析构函数有什么用途?

上面这个程序运行的时候,内存不会增加太快;
但是按了pausebreak之后,使用的内存就增加很快。
为什么?

[解决办法]
这样子写
using (test a = new c())
{

}

你就能看到析构函数了。
[解决办法]
把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作。

析构函数是由垃圾回收器控制的.
[解决办法]
Dispose(); 也会引发析构
[解决办法]
程序员也可以强制引发
[解决办法]
析构函数会被CLR调用
[解决办法]
自动引发的
[解决办法]
不要和非托管的C++类的析构函数等同.

在.NET下析构函数不会立刻执行,只有等.NET在适当的时候才会对不再使用的对象进行回收而调用它的析构函数.


[解决办法]
一般的情况下并不用在c# 中写析构函数,因为C#是由CLR来进行内存垃圾自动回收的。
因为c#中同时存在unsafe的非托管模式,所以保留了析构函数,但是如果是在托管环境中,一般都不会写析构函数。
[解决办法]
那在c#里面里写析构函数有什么用?
----------------------
主要用来释放非托管的资源。
[解决办法]
假如我在析构函数里面写了一条代码,例如
class test
{
~c()
{
Console.WriteLine( "已执行析构函数 ");
}
}
这条代码会对析构函数的功能造成什么影响吗?

-----------------------
我认为不会
[解决办法]
假如我在析构函数里面写了一条代码,例如
class test
{
~c()
{
Console.WriteLine( "已执行析构函数 ");
}
}
这条代码会对析构函数的功能造成什么影响吗?
-------------------------------
析构函数并不是一个公有方法,CLR在不可预知的时间内会自动调用该函数,有析构函数的对象new的时候需要做更多的工作,CLR执行析构函数也会损伤应用程序的性能。一般不要定义析构函数,如果要释放非托管资源的话,就让该类继承IDisposable接口,实现Dispose模式。


[解决办法]

析构函数是由垃圾回收器控制的.把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作。一般不要定义析构函数,如果要释放非托管资源的话,就让该类继承IDisposable接口,实现Dispose模式。

读书人网 >C#

热点推荐