华东15选5不开奖

全面解读C#编程中的析构函数用法

全面解读C#编程中的析构函数用法,这篇文章主要介绍了C#编程中的析构函数用法,文中最后还整理了析构函数与Dispose()方法的区别,需要的朋友可以参考下
关键字:C#、析构函数

析构函数用于析构类的实例。
备注
不能在结构中定义析构函数。只能对类使用析构函数。
一个类只能有一个析构函数。
无法继承或重载析构函数。
无法调用析构函数。它们是被自动调用的。
析构函数既没有修饰符,也没有参数。
例如,下面是类 Car 的析构函数的声明:

class Car
{
 ~Car() // destructor
 {
  // cleanup statements...
 }
}

该析构函数隐式地对对象的基类调用 Finalize。这样,前面的析构函数代码被隐式地转换为以下代码:

protected override void Finalize()
{
 try
 {
  // Cleanup statements...
 }
 finally
 {
  base.Finalize();
 }
}

这意味着对继承链中的所有实例递归地调用 Finalize 方法(从派生程度最大的到派生程度最小的)。

注意
不应使用空析构函数。如果类包含析构函数,Finalize 队列中则会创建一个项。调用析构函数时,将调用垃圾回收器?#21019;?#29702;该队?#23567;?#22914;果析构函数为空,?#25442;?#23548;致不必要的性能损失。
程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。垃圾回收器检查是否存在应用程序不再使用的对象。如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用?#21019;?#20648;此对象的内存。程序退出时?#19981;?#35843;用析构函数。
可以通过调用 Collect 强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。
使用析构函数?#22836;?#36164;源
通常,与运行时不进行垃圾回收的开发语言相比,C# 无需太多的内存管理。这是因为 .NET Framework 垃圾回收器会隐式地管理对象的内存分配和?#22836;擰?#20294;是,当应用程序封装窗口、文件和网络连接这类非托管资源时,应?#31508;?#29992;析构函数?#22836;?#36825;些资源。当对象符合析构时,垃圾回收器将运行对象的 Finalize 方法。
资源的显式?#22836;?br /> 如果您的应用程序在使用昂贵的外部资源,我们还建议您提供一种在垃圾回收器?#22836;?#23545;象前显式地?#22836;?#36164;源的方式。可通过实现来自 IDisposable 接口的 Dispose 方法来完成这一点,该方法为对象执行必要的清理。这样可大大提高应用程序的性能。即使有这种对资源的显式控制,析构函数也是一种保护措施,可用来在对 Dispose 方法的调用失败时清理资源。

下面的示例创建三个类,这三个类构成了一个继承链。类 First 是基类,Second 是从 First 派生的,而 Third 是从 Second 派生的。这三个类都有析构函数。在 Main() 中,创建了派生程度最大的类的实例。注意:程序运行时,这三个类的析构函数将自动被调用,并且?#21069;?#29031;从派生程度最大的到派生程度最小的次序调用。

class First
{
 ~First()
 {
  System.Diagnostics.Trace.WriteLine("First's destructor is called.");
 }
}

class Second : First
{
 ~Second()
 {
  System.Diagnostics.Trace.WriteLine("Second's destructor is called.");
 }
}

class Third : Second
{
 ~Third()
 {
  System.Diagnostics.Trace.WriteLine("Third's destructor is called.");
 }
}

class TestDestructors
{
 static void Main()
 {
  Third t = new Third();
 }

}

输出:

 Third's destructor is called.
 Second's destructor is called.
 First's destructor is called.


析构函数与Dispose()方法的区别
1. Dispose需要实现IDisposable接口。

2. Dispose由开发人员代码调用,而析构函数由GC自动调用。

3. Dispose方法应?#22836;?#25152;有托管?#22836;?#25176;管资源。而析构函数只应?#22836;?#38750;托管资源。因为析构函数由GC来判断调用,当GC判断某个对象不再需要的时候,则调用其析构方法,这时候该对象中可能还包含有其他有用的托管资源。

4. 通过系统GC频繁的调用析构方法来?#22836;?#36164;源会降低系?#25215;?#33021;,所以推荐显示调用Dispose方法。

5. Dispose方法结尾处?#30001;?#20195;码“GC.SuppressFinalize(this);?#20445;?#21363;告诉GC不需要再调用该对象的析构方法,否则,GC仍会在判断该对象不再有用后调用其析构方法,虽然程序不会出错,但影响系?#25215;?#33021;。

6、析构函数 和 Dispose ?#22836;?#30340;资?#20174;?#35813;相同,这样即使类使用者在没有调用 Dispose 的情况下,资源?#19981;?#22312; Finalize 中得到?#22836;擰?/p>

7、Finalize 不应为 public。

8、有 Dispose 方法存在时,应该调用它,因为 Finalize ?#22836;?#36164;源通常是很慢的。

华东15选5不开奖
湖北快三号码遗漏查询 极速pk10软件 256时时彩官网app下载 北京时时吧 360彩票导航走势图 扎金花玩法与技巧视频 福建十一选五app 骰子一六玩法 极速11选5走势 36码网址是什么