构造方法——初始化类中的数据成员
构造方法和析构方法是系统自动调用的两个方法,前者用于初始化类中的数据成员,后者用于释放类中数据成员所占的资源。学过Java的朋友注意了,Java里没有析构方法,实际上C#也不建议使用析构方法,因为C#和Java一样可以通过垃圾回收器来动态释放资源,如果非要手动释放资源,C#里有比析构方法更好的方案,那就是让类重写Dispose方法,类的任何对象都是由公共语言运行时(CLR)通过new操作符调用类构造方法来创建的。构造方法是必须的,如果没有定义构造方法,系统将提供一个默认的构造方法,构造方法首先是方法,是特殊的方法,它有其自己的定义规则:
构造方法名必须与类同名。
构造方法没有返回值,除此之外和普通方法定义方式一样。
如果提供了自定义构造方法,则系统将不再提供默认的构造方法。
系统默认的构造方法形式如下:
class Abc
{
public Abc(){}
}
系统默认的构造方法是无参数的构造方法,如上面Abc类中的Abc构造方法。系统默认的构造方法就是那样的,但上面是我们自己定义的无参构造方法,一旦定义,系统将不再默认该无参构造方法。通常,我们可以重载构造方法使对象的创建更灵活:
class Abc
{
int a,b,c;
public Abc(){}
public Abc(int _a) {a=_a;}
public Abc(int _a,int _b,int _c)
{
a=_a;b=_b;c=_c;
}
}
示例:
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;
}
public static double Distance(Point a,Point b)
{
double xdiff=a.x-b.x;
double ydiff=a.y-b.y;
return Math.Sqrt(xdiff * xdiff + ydiff * ydiff);
}
}
class Test
{
static void Main()
{
Point a=new Point();
Point b=new Point(3,4);
double d=Point.Distance(a,b);
Console.WriteLine("两点距离a到b是{2}",d);
}
}
上面的例子中我们定义了一个Point类,并为其定义了两个构造方法和一个静态的Distance方法。我们前面提到过,当存在自定义的构造方法后系统不再提供构造方法,此时如果我们不定义无参的Point构造方法,那么你将不能通过“new Point();”的方式创建Point对象,这将使Point类使用的灵活性大大降低。特别要注意的是,构造方法通常用来初始化对象的数据,每个对象实例化的时候都需要调用构造方法。另外,构造方法不允许是静态的。
析构方法——销毁对象回收资源。
析构方法的作用刚好和构造方法相反,构造方法在创建对象时使用,而析构方法是在销毁对象时使用的。销毁对象主要是指系统从内存中删除对象并回收对象所占资源的过程。对象所占资源是指对象正在使用或曾经使用的资源,包括变量所占的内存、应用程序窗口、网络链接、文件句柄、数据库链接等。这些资源有一些非常珍贵,需要及时释放。我们说C#也拥有垃圾回收器,一般对象所占的资源会被垃圾回收器自动回收,但像应用程序窗口、网络、文件、数据库等资源却要手动释放。这些释放资源的代码可以写在类的析构方法里。
当对象不再被应用程序使用时,垃圾回收器会自动调用析构方法,进行资源的释放。析构方法的定义规则和构造方法几乎相同,只是在构造方法前面加“~”符号,语法如下:
class Abc
{
public Abc(){…};//构造方法
~Abc(){…};//析构方法
}
析构方法使用时要注意:
一个类只能有一个析构方法。
无法继承或重载析构方法。
无法自己调用析构方法,它们是被自动调用的。
析构方法不用任何访问修饰符,也没有参数。
示例:
using System;
using System.IO;
namespace Test
{
class Car
{
FileStream fs;
public Car()
{
fs=new FileStream("C:\\test.txt",FileMode.OpenOrCreate);
}
~Car()
{
fs.Close();
}
}
class CMain
{
[STAThread]
static void Main(string [] args)
{
Car c=new Car();
}
}
}
上面的示例中我们在Car里定义了一个文件流对象,并在构造方法里创建了这个文件流。如前所述,文件是重要的系统资源,你必须在使用完后释放其资源(不释放的后果就是别的程序可能永远访问不了这个文件了)。我们在析构方法里调用文件流对象的Close方法将这个文件流资源释放。