日期:2014-05-20  浏览次数:21069 次

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模式。