一、原理:
构造函数一般用来初始化对像的. 和类同名;
析构函数是销毁对像占用的资源的 ,在类名前一个 “ ~ ”
当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。
一个简单的实例:
class cls s
{
public cls(){}
public ~cls(){}
}
二、命名规则
1.构造函数的名字与类同名
2.无返回值类型(这与返回值类型为void的函数不同)
三、几种常用构造函数举例
1.缺省构造函数(它由系统(CLR)提供)。
class TestClass
{
public TestClass(): base() {} // 由CLR提供
}
2.实例构造函数(实例构造函数是实现对类中实例进行初始化的方法成员)。如:
using System;
class Point
{
public double x, y;
public Point()
{
this.x = 0;
this.y = 0;
}
public Point(double x, double y)
{
this.x = x;
this.y = y;
}
…
}
class Test
{
static void Main()
{
Point a = new Point();
Point b = new Point(3, 4); // 用构造函数初始化对象
…
}
}
3.静态构造函数
静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初始化。
静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的静态构造函数自动被调用。
四.析构函数和垃圾回收器在C#中的运用
析构函数是实现销毁一个类的实例的方法成员。
析构函数不能有参数,不能任何修饰符而且不能被调用。
由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
public class ResourceHolder
{
…
~ResourceHolder()
{
// 这里是清理非托管资源的用户代码段
}
}
对于调用的优先顺序,实例如下:
class Program
{
static void Main(string[] args)
{
C c = new C();
GG.C();
}
public static class GG
{
static GG()//静态构造函数中不能有访问修饰符,默认为私有构造函数,这也是私有构造函数的用法。
{
Console.WriteLine("静态类GG!");
}
public static void C()
{
Console.WriteLine("静态类GG的静态方法");
}
/*
~GG() //静态类不能包含析构函数
{
Console.WriteLine("静态类S的析构函数!");
}
*/
}
public class A
{
static A()
{
Console.WriteLine("A类的静态构造函数!");
}
public A()
{
Console.WriteLine("A类的实例构造函数!");
}
~ A()
{
Console.WriteLine("A类的析构函数!");
}
}
public class B:A
{
static B()
{
Console.WriteLine("B:A的静态构造函数!");
}
public B()
{
Console.WriteLine("B:A的实例构造函数!");
}
~B()
{
Console.WriteLine("B:A的析构函数");
}
}
public class C : B
{
static C()
{
Console.WriteLine("C继承B的静态构造函数!");
}
public C()
{
Console.WriteLine("静态类的静态构造函数!");
}
~ C()
{
Console.WriteLine("C:B的构造函数! ");
}
}
}
执行结果如下:
C:B类的静态构造函数!
B:A类的静态构造函数!
A类的静态构造函数!
A类的实例构造函数!
B:A类的实例构造函数!s
C:B类的实例构造函数!
静态类GG!//
静态类GG的静态方法!
C:B类的析构函数!
B:A类的析构函数!
A类的析构函数!
总结:程序执行时,对于静态构造函数:先执行自己的静态构造函数再执行父类的构造函数,
执行实例构造函数时,先执行父类的实例构造函数,再执行自己的实例构造函数