一、前言
作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性,C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,但是程序通过了编译检查并不表示错误已经不存在了,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。微软利用面向对象的概念在设计C#语言时充分考虑了这个问题并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作。
二、构造函数
构造函数又叫构造方法,它是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化,也就是就是对类进行初始化。
主要特点:
1、构造函数的名字必须与类同名
2、构造函数没有返回类型,它可以带参数,也可以不带参数
3、声明类对象时,系统自动调用构造函数,构造函数不能被显式调用
4、构造函数可以重载,从而提供初始化类对象的不同方法
5、若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空
语法:
[访问修饰符] <类名>() { //构造函数的主体 }
构造函数分为实例构造函数、私有构造函数和静态构造函数
(1、)实例构造函数
实例构造函数是实现对类中实例进行初始化的方法成员。
class Program { public class cat { int i; public cat() //定义cat类的构造方法 { i = 4; Console.WriteLine("The cat,{0} ", i); } static void Main(string[] args) { cat cat1 = new cat(); Console.Read(); } } }首先定义了一个私有成员i,经过初始化给它赋了一个初值4,当实例化类cat时,就会执行实例构造函数。
(2、)私有构造函数
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。 如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类无法创建该类的实例。
class Program { public class dog { private dog() { Console.WriteLine("this is dog"); } } public class cat { int i; private cat() //定义cat类的构造方法 { i = 4; Console.WriteLine("The cat,{0}", i); } static void Main(string[] args) { dog dog1 = new dog(); //不可访问,受保护级别限制而无法实例化 cat cat1 = new cat(); Console.Read(); } } }这是举了一个错误的例子,即使在dog类中添加一个静态成员,依旧无法创建dog类的实例。
静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初始化。静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的静态构造函数自动被调用。
class Program { public class dog { static int i; static dog() { i = 1; Console.WriteLine("the dog 默认构造函数 i={0}",i ); } } public class cat { static void Main(string[] args) { dog dog1 = new dog(); Console.Read(); } } }注意静态构造函数只能对静态数据成员进行初始化,而不能对非静态数据成员进行初始化。但是,非静态构造函数既可以对静态数据成员赋值,也可以对非静态数据成员进行初始化。
三、析构函数
析构函数是实现销毁一个类的实例的方法成员。析构函数不能有参数,不能任何修饰符而且不能被调用。由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
虽然C#(更确切的说是CLR)提供了一种新的内存管理机制——自动内存管理机制,资源的释放是可以通过“垃圾回收器” 自动完成的,一般不需要用户干预,但在有些特殊情况下还是需要用到析构函数的,如在C#中非托管资源的释放。
语法:
public class ResourceHolder { ...... ~ResourceHolder() { // 这里是清理非托管资源的用户代码段 } }构造函数与析构函数虽然是一个类中形式上较简单的函数,但它们的使用决非看上去那么简单,因此灵活而正确的使用构造函数与析构函数能够更好的管理系统中的资源。继续加油!!