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